(1) readonly et const sont tous deux utilisés pour marquer des constantes.
(2) L'affectation d'initialisation est différente.
Les constantes modifiées Const doivent se voir attribuer une valeur en même temps qu'elles sont déclarées. Par exemple :
public class Class1 { public const int MaxValue = 10; //正确声明 public const MInValue; //错误:常量字段要求提供一个值 public Class1() { MinValue = 10; } }
des champs en lecture seule peuvent être attribués lors de l'initialisation (déclaration ou constructeur). Par conséquent, les champs en lecture seule peuvent avoir des valeurs différentes selon le constructeur utilisé.
public class Class1 { public readonly int c = 10; //正确声明 public readonly int z; public Class1() { z = 24;//正确 } protected void Load() { z = 24;//错误:无法对只读的字段赋值(构造函数或变量初始值指定项中除外) } }
readonly est un membre d'instance, donc différentes instances peuvent avoir des valeurs constantes différentes, ce qui rend la lecture seule plus flexible.
public readonly Color Red = new Color(255, 0, 0); public readonly Color Green = new Color(0, 255, 0); public readonly Color Blue = new Color(0, 0, 255);
(3) les champs const sont des constantes de compilation, tandis que les champs en lecture seule peuvent être utilisés pour les constantes d'exécution.
const nécessite que le compilateur soit capable de calculer une certaine valeur au moment de la compilation. Au moment de la compilation, chaque endroit où la constante est appelée est remplacé par la valeur calculée. Vous ne pouvez donc pas extraire une valeur d’une variable pour initialiser une constante.
Readonly permet de définir un champ sur une constante, mais peut effectuer certaines opérations et déterminer sa valeur initiale. Étant donné que la lecture seule est exécutée au moment du calcul, elle peut être initialisée avec certaines variables. Cette valeur est déterminée au moment de l'exécution.
(4) const est statique par défaut, et readonly doit être explicitement déclaré s'il est défini sur static.
(5) Le type de valeur modifié par const est également limité. Il ne peut s'agir que de l'un des types suivants (ou peut être converti dans les types suivants) : sbyte, byte, short, ushort, int, uint, long. , ulong, char, float, double, decimal, bool, string, type enum ou type référence. Notez que le type de référence qui peut être déclaré comme const ne peut être qu'une chaîne ou d'autres types de référence dont la valeur est nulle. readonly peut être de n’importe quel type.
C'est-à-dire que lorsque nous avons besoin d'une constante const, si son type l'empêche de pouvoir calculer une valeur définie au moment de la compilation, alors nous pouvons la résoudre en la déclarant comme statique en lecture seule. Mais il existe quand même une légère différence entre les deux. Regardez les deux documents différents ci-dessous.
file1.cs
using System; namespace MyNamespace1 { public class MyClass1 { public static readonly int myField = 10; } }
file2.cs
namespace MyNamespace2 { public class MyClass1 { public static void Main() { Console.WriteLine(MyNamespace1.MyClass1.myField); } } }
Les deux classes appartiennent à deux fichiers file1.cs et file2.cs et sont compilées séparément. Lorsque le domaine myField dans le fichier file1.cs est déclaré statique en lecture seule, si nous modifions la valeur de myField à 20 en raison d'un besoin, il nous suffit alors de recompiler le fichier file1.cs en file1.dll lors de l'exécution de file2. exe Autrement dit, vous en obtiendrez 20.
Mais si vous remplacez static readonly par const puis modifiez la valeur d'initialisation de myField, nous devons recompiler tous les fichiers qui font référence à file1.dll, sinon le MyNamespace1.MyClass1.myField auquel nous faisons référence ne sera pas comme nous l'espérions. . Il est particulièrement important d’y prêter attention lors du développement de grands systèmes.
(6) objet, Array (array) et struct (structure) ne peuvent pas être déclarés comme constantes const.
Ce qui précède est la différence entre const et readonly dans c#.net Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (m.sbmmt.com) !