문제

최근에 일반 매트릭스를 만들었습니다u003CT> 목록 주변의 래퍼 역할을하는 클래스 u003CListu003CT> > 수집. 내가 알 수있는 한,이 수업은 완벽하게 작동합니다. T의 기본값과 관련하여 약간의 문제가 발생합니다.

매트릭스 인스턴스를 만듭니다u003Cint> (3, 3)은 int의 3x3 행렬을 생성하고 기본값 (t)을 사용하여 기본값으로 0으로 기본값을 사용합니다. 값 유형 (프리미티브 포함) 기본값은 0 동등한 기본 및 기본 유형의 기본값을 NULL로 알고 있습니다. 이 기본값을 변경할 수 있는지 궁금해서 값 유형이 행렬에 전달되면 0 대신 5와 같은 5 개가 채워집니다.

나는 나만의 구조물 (값 유형)을 만들려고했지만 structs 내부에서 매개 변수가없는 생성자를 사용할 수 없기 때문에 기본값을 0에서 변경하는 방법을 찾을 수 없습니다.

기본값을 변경하는 것은 불가능한 것으로 생각되며, 인스턴스화 된 후 셀에 의해 매트릭스 셀을 통해 루프를해야하지만, 그렇게하기 전에 대비해 여기에서 물어보고 싶었습니다.

도움이 되었습니까?

해결책

 public Matrix(int width, int height) : this(width, height, default(T)) {}
 public Matrix(int width, int height, T defaultValue)
 {
     List<T> rows = new List<T>(height);
     for (int i = 0; i < height; i++)
     {
         List<T> columns = new List<T>(width);
         for (int j = 0; j < width; j++)
         { columns.Add(defaultValue); }
         rows.Add(columns);
     }
     // store `rows` wherever you are storing it internally.
 }

그러나 요셉이 말했듯이 default(T) 평가합니다.

다른 팁

설명하는 방식과 같은 기본값을 변경할 수있는 방법은 없습니다.

var someInt = default(int); //this will always be 0, you can't change it
var someReference = default(SomeClass); //this will always be null

여기에 있습니다 MSDN 기사 그것에, 그것은 불행히도 이미 말한 것보다 훨씬 더 설명 적은 아니지만.

값을 캡슐화하는 구조를 만들 수 있고 원하는 기본값의 오프셋으로 만 노출 할 수 있습니다.

public struct DefaultFiveInteger {

   private int _value;

   public DefaultFiveInteger(int value) {
      _value = x - 5;
   }

   public static implicit operator int(DefaultFiveInteger x) {
      return x._value + 5;
   }

   public static implicit operator DefaultFiveInteger(int x) {
      return new DefaultFiveInteger(x);
   }

}

이제 기본값 (0)으로 초기화 된 변수를 선언 할 수 있으며 오프셋으로 값을 반환합니다.

DefaultFiveInteger x;
Console.Write(x);

산출:

5

글쎄, 당신은 이미 structs를보고 있기 때문에 다음과 같이 기본값을 시뮬레이션 할 수 있습니다.

public struct MyInt
{
    private int _defaultInt;
    public int DefaultInt
    {
        get
        {
            if (_defaultInt == 0)
                return 5;
            else
                return _defaultInt;
        }
        set
        {
            _defaultInt = value;
        }
    }
}

구현에 대한 나의 이해 default(T) 런타임은 기본적으로 애플리케이션이 요청대로 메모리를 제로 꺼내고 C#은 0을 덮어 쓰지 않고 공간을 할당합니다. 비수체 유형의 기본값 (예 : Null Reference, False)의 기본값은 메모리의 0으로 표시됩니다. 이것은 이상한 행동으로 이어질 수 있습니다. 예를 들어, default(MyEnumType) 열거 값을 0과 동일하게 지정하지 않더라도 0이됩니다.

Guffa와 Dougjones 아이디어를 결합하여 속성 후원 회원을 상쇄 할 수 있습니다.

public struct MyInt
{
    private const int INT_DEFAULT = 5;
    private int _defaultInt;
    public int DefaultInt
    {
        get { return _defaultInt + INT_DEFAULT; }
        set { _defaultInt = value - INT_DEFAULT; }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top