web-dev-qa-db-fra.com

Comment faire une valeur par défaut pour la structure en C #?

J'essaie de faire une valeur par défaut pour ma structure. Par exemple, la valeur par défaut pour Int - 0, pour DateTime - 1/1/0001 12:00:00 AM. Comme nous le savons, nous ne pouvons pas définir de constructeur sans paramètre dans la structure.

struct Test
{
    int num;
    string str;
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(default(Test)); // shows namespace and name of struct test.Test
        Console.WriteLine(new Test()); // same

        Console.ReadKey(true);
    }
}

Comment puis-je créer une valeur par défaut pour struct?

12
unsafePtr

Tu ne peux pas. Les structures sont toujours préréglées à zéro et il n'y a aucune garantie que le constructeur soit appelé (par exemple new MyStruct[10]). Si vous avez besoin de valeurs par défaut autres que zéro, vous devez utiliser une classe. C'est pourquoi vous ne pouvez pas changer le constructeur par défaut en premier lieu (jusqu'à C # 6) - il ne s'exécute jamais.

Le plus proche que vous pouvez obtenir est d'utiliser les champs Nullable et de les interpréter comme ayant une valeur par défaut s'ils sont nuls via une propriété:

public struct MyStruct
{
  int? myInt;

  public int MyInt { get { return myInt ?? 42; } set { myInt = value; } }
}

myInt est toujours préréglé à zéro, mais vous interprétez le "zéro" comme votre propre valeur par défaut (dans ce cas, 42). Bien sûr, cela peut être des frais généraux totalement inutiles :)

En ce qui concerne la Console.WriteLine, il appelle simplement le virtuel ToString. Vous pouvez le changer pour le retourner comme vous le souhaitez.

20
Luaan

Votre problème n'est pas lié au comportement de C # /. Net. La façon dont vous instanciez la structure crée efficacement une instance avec des valeurs par défaut pour tous les champs membres.

Console.WriteLine Convertit son argument en chaîne à l'aide de la méthode ToString (). L'implémentation par défaut (Object.ToString()) écrit simplement le nom de classe complet (espace de noms et nom, comme vous l'appelez).

Si vous souhaitez une autre visualisation, vous devez remplacer la méthode ToString:

public struct Test
{
    int num;
    string str;
    public override string ToString()
    {
        return $"num: {num} - str: {str}";
    } 
}
3
jeroenh

Imprimer les objets des résultats C # avec des espaces de noms, sauf si vous remplacez .ToString () pour vos objets. Pouvez-vous définir votre structure comme ci-dessous et l'essayer?

public struct Test
{
    int num;
    string str;
    public override string ToString()
    {
        return "Some string representation of this struct";
    }
}

PS: default (Test) vous donne une structure contenant default (int) et default (string) que je veux dire Test.num est 0 et Test.str est null

J'espère que cela t'aides

1
Cihan Uygun

Ce que vous voulez probablement faire, c'est remplacer ToString(), par exemple.

struct Test
{
    int num;
    string str;

    public override string ToString ()
    {
        return string.Format ($"{str} | {num}");
    }
}

Comme vous l'avez mentionné, il est impossible de définir des valeurs par défaut pour des champs autres que des valeurs par défaut pour leurs types appropriés. Cependant, avec une surcharge ToString(), vous verrez des informations mieux formatées sur votre structure dans la console et pendant le débogage.

0