Ist es möglich, den Standardwert eines primitiven Datentypen zu ändern?
-
05-07-2019 - |
Frage
Ich habe vor kurzem eine allgemeine Matrix > 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
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.
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.
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; }
}
}