programing

구조체를 초기화하는 방법?

copyandpastes 2021. 1. 19. 08:18
반응형

구조체를 초기화하는 방법?


다음 할당을 가능하게하려면 내 임의의 구조에서 어떤 멤버를 구현해야합니까?

public struct MyStruct {
   String s;
   Int length;
}

MyStruct myStruct = new MyStruct { s = "Hello", length = 5 };

// Now, I want the following code to set the 's' to "Lol" and the
// length to 3 (length of "Lol"). The second part should be done
// automatically.
myStruct = "Lol"; // Or myStruct = String("Lol");

어떻게해야합니까?


문자열 값을 구조체 값으로 변환하는 암시 적 연산자를 사용합니다.

public struct MyStruct {
  public string s;
  public int length;

  public static implicit operator MyStruct(string value) {
    return new MyStruct() { s = value, length = value.Length };
  }

}

예:

MyStruct myStruct = "Lol";
Console.WriteLine(myStruct.s);
Console.WriteLine(myStruct.length);

산출:

Lol
3

구조 유형은 실용적 일 때마다 모든 상태를 공개 필드에 캡슐화해야하며, 이는 해당 유형에 대해 유효한 값으로 독립적으로 설정 될 수 있거나 생성자, 팩토리를 통해서만 설정 될 수있는 단일 통합 값으로 작동해야합니다. , 메서드 또는 기타 구조체의 인스턴스를 명시 적 ref매개 변수를 공개 메소드 중 하나에 추가합니다. 일부 사람들이 주장하는 것과는 반대로, 개별적으로 조작되거나 그룹으로 전달 될 수있는 값 집합 (예 : 점의 좌표)을 나타내는 값 집합을 나타내야한다면 공용 필드가있는 구조체에 문제가 없다고 주장합니다. 역사적으로, public property setter가있는 구조에 문제가 있었고 public 필드를 피하려는 욕구 (대신 setter를 사용해야 함을 암시 함)로 인해 일부 사람들은 변경 가능한 구조를 모두 피해야한다고 제안했지만 필드에는 속성이 가진 문제. 이 때문에 실제로 노광 필드 구조체는 독립 변수의 느슨한 모음의 이상적인 표현 변수의 단지 느슨한 컬렉션.

그러나 귀하의 특정 예에서는 구조체의 두 필드가 독립적으로 간주되지 않는 것으로 보입니다. 구조체를 현명하게 디자인 할 수있는 세 가지 방법이 있습니다.

  • 유일한 public 필드는 문자열이고 length문자열이 널이 아닌 경우 길이를보고 하는 읽기 전용 "도우미"속성 을 가질 수 있고, 문자열이 널이면 0을 반환합니다.

  • 구조체가 공용 필드, 속성 설정자 또는 변경 메서드를 노출하지 않고 유일한 필드 (개인 문자열)의 내용을 개체의 생성자에 지정하도록 할 수 있습니다. 위와 같이 length저장된 문자열의 길이를보고하는 속성입니다.

  • 구조체가 공용 필드, 속성 설정자 또는 변경 메서드를 노출하지 않고 두 개의 전용 필드를 가질 수 있습니다. 하나는 문자열 용이고 다른 하나는 길 이용이며 둘 다 문자열을받는 생성자에 설정되어 저장됩니다. , 길이를 측정하고 저장합니다. 문자열의 길이를 결정하는 것은 충분히 빠르기 때문에 그것을 계산하고 캐시 할 가치가 없을 것입니다. 그러나 문자열과 그 GetHashCode을 결합한 구조를 갖는 것이 유용 할 수 있습니다 .

그러나 세 번째 설계와 관련하여 세부 사항을 인식하는 것이 중요합니다. 스레드 안전이 아닌 코드로 인해 구조의 한 인스턴스가 읽히고 다른 스레드가 작성되는 경우 실수로 구조 인스턴스가 생성 될 수 있습니다. 필드 값이 일치하지 않습니다. 결과 동작은 클래스가 스레드 안전이 아닌 방식으로 사용될 때 발생하는 동작과 약간 다를 수 있습니다. 보안과 관련이있는 모든 코드는 구조 필드가 일관된 상태에 있다고 가정하지 않도록주의해야합니다. 악의적 인 코드 ( "완전 신뢰"환경에서도)는 상태가 일치하지 않는 구조체를 쉽게 생성 할 수 있기 때문입니다. 하고 싶어합니다.

PS- 문자열의 할당을 사용하여 구조를 초기화하려면 암시 ​​적 변환 연산자를 사용하고 Lengthnull이 아닌 경우 기본 문자열의 길이를 반환하는 읽기 전용 속성으로 만드는 것이 좋습니다. 문자열이 널이면 0입니다.


  1. "길이"는 "s"의 실제 길이에서 벗어날 수 있습니다. 대답이 '아니요'이면 길이를 저장할 필요가 없습니다. 문자열은 이미 길이를 저장하고 s.Length를 호출 할 수 있기 때문입니다.

  2. 요청한 구문을 얻으려면 다음과 같이 "암시 적"연산자를 구현할 수 있습니다.

    static implicit operator MyStruct(string s) {
        return new MyStruct(...);
    }
    
  3. 암시 적 연산자는 구조체를 변경 가능하게 만들 었는지 여부에 관계없이 작동합니다.


당신의 구조체는 메소드와 속성을 가질 수 있습니다.

public struct MyStruct { 
    public string s;
    public int length { return s.Length; }
}

Correction @Guffa's answer shows that it is possible... more info here: http://www.codeproject.com/KB/cs/Csharp_implicit_operator.aspx

ReferenceURL : https://stackoverflow.com/questions/4420094/how-to-initialize-struct

반응형