Frage

Ich habe vor kurzem eine allgemeine Matrix Klasse, die um eine List > Sammlung als Wrapper fungiert. Soweit ich das beurteilen kann, arbeitet diese Klasse perfekt. Ich bin in ein kleines Problem läuft allerdings in Bezug auf die Standardwerte des T-Shirts.

ich eine Instanz von Matrix (3, 3), die eine 3x3-Matrix von Ints erstellt, die alle auf 0 zurück Standard mit (T). Ich weiß, dass Werttypen Standard zu einem 0-Äquivalent (die Primitiven umfassen), und die Bezugstypen Standard auf null. Ich frage mich, ob es möglich war, diesen Standardwert zu ändern, so dass, wenn ein Werttyp in die Matrix übergeben wird, wäre es zum Beispiel mit 5s bestückt werden, statt 0 ist.

Ich habe versucht, meine eigene Struktur (Werttyp) zu schaffen, aber wegen nicht in der Lage parameterlos Bauer innerhalb structs zu verwenden, kann ich nicht einen Weg finden, um den Standardwert von 0 zu ändern.

Ich vermute, dass die Änderung des Standardwert nicht möglich ist, und ich werde von Zelle zu Schleife durch die Matrix-Zelle habe, nachdem sie instanziiert wurde, aber ich wollte hier nur für den Fall fragen, bevor ich das tun.

War es hilfreich?

Lösung

 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.
 }

Aber wie Joseph sagt, es gibt keine Möglichkeit der Einstellung, was default(T) ausgewertet.

Andere Tipps

Es gibt keine Möglichkeit, den Standardwert zu ändern, wie, wie Sie beschreiben.

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

Hier ist ein Msdn Artikel drauf , obwohl es als nicht viel mehr beschreibend ist, was schon ist gesagt worden, leider.

Sie können eine Struktur bilden, die es Wert kapselt und setzt sie nur mit einem der Standard-Offset-Wert, der gewünscht wird:

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);
   }

}

Jetzt können Sie eine Variable deklarieren, die auf den Standardwert initialisiert (0), und es wird den Wert mit dem Offset zurück:

DefaultFiveInteger x;
Console.Write(x);

Ausgabe:

5

Nun, da Sie bei structs freuen uns schon, können Sie einen Standardwert simulieren wie folgt:

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

Mein Verständnis für die Durchführung von default(T) ist, dass die Laufzeit, die standardmäßig Nullen aus dem Speicher als die Anwendung anfordert, und C # ordnet nur den Raum, ohne jemals die Nullen zu überschreiben. Es passiert einfach so, dass die Standardwerte von nicht-numerischen Typen (beispielsweise die Nullreferenz, false) werden als Nullen im Speicher dargestellt. Dies kann zu einigen seltsamen Verhalten führen; zum Beispiel wird default(MyEnumType) Null, selbst wenn Sie nie einen Enum-Wert gleich Null ist.

angegeben

Guffa ist und Doug Jones Ideen Kombination können Sie eine Offset-Eigenschaften Stützelement.

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; }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top