2010-08-18 1 views
3

저는 C#으로 전환하는 vb.net 프로그래머입니다. VBer에 대한 C# 질문. 비공개 필드를 Static으로 선언해야합니까?

나는이

using System; 
using System.IO; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 


namespace eScoreSwapper 
{ 
    class Program 
    { 
     private string _dbName = ConfigurationManager.AppSettings["dbName"]; 

     static void Main(string[] args) {} 

     static void InitVars() 
     { 
      if (string.IsNullOrEmpty(_dbName)) _dbName = ""; 
     } 
    } 
} 

이는 _dbName 변수 InitVars의 경우 절에서 컴파일 오류를주고있다 (NET20 대상) 콘솔 응용 프로그램에 대한 다음 코드를

Error 1 An object reference is required for the non-static field, method, or property 'eScoreSwapper.Program._dbName' C:\Users\SethS\Documents\eScore\Versions\Trunk\dotNet\eScoreSwapper\eScoreSwapper\Program.cs 26 38 eScoreSwapper 

그것을인가 그것이 사실이기 때문에. C#에서는 정적이라고 선언되지 않는 한 private 클래스 필드를 참조 할 수 없습니까? 나는 틀린 일을하고 있다고 확신한다.

내가 여기있는 동안 다른 C# 질문을 할 수 있습니다. if 문이 유효한 이유는 무엇입니까? 중괄호가 필요없는 이유는 무엇입니까? 조건에 단일 표현식이 오는 한 유효한 구문입니까 (t-sql IF와 같습니다).

도움 주셔서 감사합니다.

세스

+1

I LOVE STACKOVERFLOW Seth –

+0

null-coalescing 연산자 (http://msdn.microsoft.com/en-us/library/ms173224.aspx)를 사용할 수 있음을 지적 할 것입니다. 즉'InitVars()'내부에서'_dbName = ConfigurationManager.AppSettings [ "dbName"] ?? ";". 그건 단지 클래스에서 초기화하는 대신에, 방금 초기화 한 것을 그 메소드 안에서 체크하는 것입니다. 이것은 당신의 질문과는 아무런 관련이 없지만, C#으로 바꾸고 있다면이 편리한 연산자에 대해 알아두면 좋을 것 같습니다. – jloubert

답변

8

아니요. 그러나 정적 메서드에서 사용하는 비공개 필드는 않습니다. 당신이 정말로하고 싶다고 생각하는 것은 InitVars()의 선언에서 static을 제거하는 것입니다. 나는거야

이전에 시도한다고 가정

static void Main(string[] args) 
{ 
    InitVars(); 
} 

하고 InitVars에 static를 추가 그래서 실패(). 잘못된 답변. 기본적으로 Main()은 클래스의 일부가 아닌 척해야합니다. 마찬가지로 지금까지 만약() 문

if (string.IsNullOrEmpty(_dbName)) _dbName = ""; 

static void Main(string[] args) 
{ 
    Program prog = new Program(); 
    prog.InitVars(); 
} 

는 단지 짧은 버전 :) 공식적으로 C 틱 언어, (경우에,

if (string.IsNullOrEmpty(_dbName)) 
    _dbName = ""; 

이제 true이면 다음 문장이 실행됩니다. 그러나 중괄호로 묶어 하나의 문장으로 여러 문장을 만들 수 있습니다. 그러나 실제로 한 가지 진술 만 있으면 필요하지 않습니다.

+0

그래 ... 이것은 정확히 일어난 일입니다. 도와 주셔서 감사합니다. 세스 –

5

정적 메서드에서 인스턴스 멤버 변수를 사용할 수 없습니다. 변수를 정적으로 만들거나 메소드와 변수를 인스턴스 클래스에 넣고 프로그램의 main에 새로 추가하십시오.

정적 메서드에서 인스턴스 변수에 액세스 할 수없는 이유는 변수가 "인스턴스에"있는 동안 메서드가 "클래스에"있다고 생각할 때 분명 해집니다. 희망이 도움이됩니다.

마지막 주석으로, 컴파일러가 오류를 제공한다는 사실을 필드에 개인 필드와 아무 관련이 없다는 점을 추가합니다. 귀하의 필드가 공개, 내부 등 컴파일러는 여전히 당신에게 같은 오류를 줄 것이다 : 즉. 정적 메서드는 인스턴스 변수에 액세스 할 수 없습니다.

+0

구성원을 * instance *로 한정해야합니다. – ChaosPandion

1

정적 메서드로 비 정적 멤버에 액세스 할 수 없습니다.

중괄호를 두 개 이상의 명령문에 적용하지 않으려면 중괄호가 필요하지 않습니다. 하지만 어쨌든 넣어야합니다.

1

중괄호에 대한 질문에 대답하려면 if 블록에 둘 이상의 명령문이 있으면 C#에서만 필수입니다. 그렇지 않으면 한 줄짜리를 if과 같은 줄에 넣거나 다음 줄에 넣을 수 있습니다. 나는 그것이 일반적으로 괄호를 사용한다는 것은 코딩 표준에서 일반적으로 권고된다고 생각한다. 항상 모든 일련의 코드를 일련의 코드에 넣지 않는 것이 좋지만, 3 차 및 null 병합 연산자가있는 경우에는 그 종류가 창 밖으로 나왔습니다.

당신이 반원의 기준을 가지고 방법 파라미터를 이용하지 않고 고정 방법 내에서 비 ​​정적 반원 액세스 할 수
1

.

는 IF 구문 통상의 C# (C++, C) . 중괄호는 복잡한 여러 줄 블록에만 필요합니다. 다음의 else는 단 하나의 줄을 가질 수 있습니다.

0

정적 컨텍스트에서 인스턴스 필드에 액세스하려고합니다. _dbName은 정적으로 표시되지 않으므로 Program 클래스의 인스턴스마다 다를 수 있으므로 정적 메서드 InitVars()은 올바른 값이 무엇인지 알 수 없습니다.

의 모든 단일 인스턴스가 _dbName에 대해 동일한 값을 가질 경우 _dbName은 정적으로 표시되어야합니다. 다른 인스턴스가 다른 값을 가질 수있는 경우 InitVars()이 인스턴스 메소드 여야합니다 (static 키워드를 제거하고 정적 Main이 아닌 실제 Program 오브젝트에서만 호출하십시오).

0

VB 용어로 "정적"은 "공유"됩니다.

관련 문제