2010-12-10 4 views
13

구조체에 대한 조언이 필요합니다.C# 컴파일러 오류 : "구조체에 인스턴스 필드 초기화 기가 없습니다"

코드 섹션이 2 개 있습니다. 첫 번째 섹션은 아래와 같다 :

namespace Project.GlobalVariables 
{ 
    class IOCard 
    { 
     struct InputCard 
     { 
      public string CardNo; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo = new int[16]; 
      public int[] ReadBitNo = new int[16]; 
     } 

     static InputCard[] InputCards = new InputCard[5]; 

     public static string ACardNo = InputCards[1].CardNo; 
     public static string BCardNo = InputCards[2].CardNo; 

    } 
} 

제 2 부분은 아래와 같다 :

private void Form1_Load(object sender, EventArgs e) 
    { 
     IOCard.ACardNo = "Card A"; 
     IOCard.BCardNo = "Card B"; 

     MessageBox.Show(IOCard.ACardNo); 
     MessageBox.Show(IOCard.BCardNo); 
    } 

내 계획 할당 Form1_Load에 도시 IOCard를 사용하여 InputCards 요소를 검색 할 수있다.

그러나 코드를 컴파일 할 때 다음 오류가 발생합니다.

Error 1 'Project.GlobalVariables.IOCard.InputCard.WriteBitNo': cannot have instance field initializers in structs E:\Programming\New platform\StandardPlatform\StandardPlatform\Project\GlobalVariables.cs 16 26 StandardPlatform

누군가가 오류를 해결하는 방법을 말해 줄 수 있습니까? 알려주십시오. 감사.

다음은 내가 만들고 사용하려고 시도했지만 실패한 클래스입니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Project.GlobalVariables 
{ 
    static class IOCard 
    { 
     public const int TotalInputCard = 10; 
     public const int TotalOutputCard = 10; 

     public class InputCard 
     { 
      public string CardNo = "1"; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo = new int[16]; 
      public int[] ReadBitNo = new int[16]; 
     } 

     public class OutputCard 
     { 
      public string CardNo; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo = new int[16]; 
      public int[] ReadBitNo = new int[16]; 
     } 

     public static InputCard[] InputCards = new InputCard[TotalInputCard]; 
     public static OutputCard[] OutputCards = new OutputCard[TotalOutputCard]; 

     public static int X100 = InputCards[0].WriteBitNo[0]; 
     public static int Y100 = OutputCards[0].WriteBitNo[0]; 
    } 
} 

나는 그렇게처럼 Form_Load에서 다음을 사용하려고 : 아무리 내가 답변을 인터넷에서 검색하는 것을 시도했다 얼마나
private void Form1_Load(object sender, EventArgs e) 
{ 
    IOCard.X100 = 1; 
    IOCard.Y100 = 1; 
} 

, 나는 아무데도 없어했다.

알려 주시기 바랍니다. 감사.

답변

1

구조 대신 클래스를 사용하십시오. 구조는 Point와 같은 작은 유형에 사용되며, 동적으로 작성하고 참조로 전달하는 것보다 스택 및 사본에서 더 빨리 작성할 수 있습니다.

+0

죄송합니다. "동적으로 만드는 것"보다는 "동적으로 만드는 것"을 이해할 수 없습니까? –

+1

구조체 변수를 함수에 전달하거나 함수에서 반환하면 전체 변수가 복사됩니다 ("동적으로 생성됨"). 클래스 변수를 전달하면 해당 인스턴스에 대한 참조 만 전송됩니다. 데이터가 16 바이트보다 작 으면 참조를 전달하는 것보다 전체 인스턴스를 복사하는 것이 실제로 빠릅니다. 구조체가 커질수록 더 많은 데이터가 복사 될 때마다 복사해야하므로 더 느리게됩니다. – Excrubulent

1

예외에 대해서는 확실하지 않지만 해결책이 있습니다.

이 클래스에는 "struct"를 사용하면 안되며 너무 많아서 너무 많은 데이터를 저장해야합니다. "클래스"로 정의하면 동일한 코드가 정상적으로 작동합니다.

5

struct의 필드를 초기화하거나 기본 생성자를 정의하여 해당 필드를 초기화 할 수 없습니다. struct을보고 나서 class을 대신 사용하는 것이 좋습니다. 여러 필드가있는 경우에 struct을 사용하지 않는 것이 좋습니다.

+0

'struct'를 사용할시기에 대한 지침 : http://msdn.microsoft.com/en-us/library/y23b5415%28VS.71%29.aspx – decyclone

1

class 대신 struct이 필요하신 이유가 있습니까?

class으로 설정하면 올바르게 작동합니다.

9

무엇 당신이 InputCards = new InputCard[5];이있는 경우는 int[] WriteBitNo = new int[16];과 같은 과제를 수행 할 기회가없는 5 배에게 InputCard 구조의 크기를 메모리 블록을 할당하고 0의 모든 바이트를 설정하는 것입니다 말을하려고입니다 , 그래서 당신은 그들을 가질 수 없습니다.

귀하의 옵션은 구조체에 대한 이니셜 라이저를 수동으로 호출하거나 클래스로 만들고 의 5 개의 새 인스턴스로 InputCards 배열을 수동으로 초기화해야합니다.

1

시도해보십시오.팩토리 함수 Create()으로 InputCard 초기화 : C#으로

namespace Project.GlobalVariables 
{ 
    class IOCard 
    { 
     struct InputCard 
     { 
      public string CardNo; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo; 
      public int[] ReadBitNo; 

      static InputCard Create() 
      { 
       return new InputCard() 
       { 
        CardNo = string.Empty, 
        WriteBitNo = new int[16], 
        ReadBitNo = new int[16] 
       }; 
      } 
     } 

     static InputCard[] InputCards = new InputCard[] 
     { 
      InputCard.Create(), 
      InputCard.Create(), 
      InputCard.Create(), 
      InputCard.Create(), 
      InputCard.Create() 
     }; 

     public static string ACardNo = InputCards[1].CardNo; 
     public static string BCardNo = InputCards[2].CardNo; 

    } 
} 
+0

조언을 주셔서 감사합니다. 내가 수업 시간에 어떻게 할 수 있니? 모든 샘플 코드? 감사. – JoJo

1

하기, structclass 값이 타입의 값이 방식에서 오브젝트 참조하지이다. struct의 값은 struct의 인스턴스 필드 값의 "합집합"입니다.

이제 struct 유형의 기본값은 모든 필드가 기본값을 갖는 값입니다. C#, 구문의 시작 이후 : S이 구조체 타입

new S() // S is a value-type 

, 즉 구조체의 기본값에 상당하고있다. 생성자 호출이 없습니다! 이것은 (구조체의 인스턴스 필드 이니셜 라이저를 가질 수 없습니다 ) 불법 (현재)도

struct S { int field = 42; // non-static field with initializer, disallowed! // ... } 

처럼, 이제 일을
default(S) // S is a value-type 

을 쓸 수있는 동일한 값으로되어있다. 그들은 new S()field42 일 것이라는 인상을 줄 수 있지만 실제로 fieldnew S() 인 기본값은 int (기본값은 42과 달라야 함)이어야합니다.

이 설명과 함께 C#에서는 not possible to create a non-static, zero-parameter constructor for a struct type이라는 이유도 확인할 수 있습니다.