為什么我沒有因為FieldTwo沒有在建構式中設定而得到一個非空的警告(或其他警告)?我使用的是.Net 5.0,Nullable選項在專案檔案中被設定為true。
public class MyClass
{
public string FieldOne;
public long FieldTwo;
public MyClass (string P1, long p2)。
{
FieldOne = p1;
// FieldTwo沒有設定。非空值的警告在哪里!? }
}
}
uj5u.com熱心網友回復:
long是一個值型別,不能為空。所以沒有理由對null發出警告。我懷疑你想要的是一個欄位未初始化的警告。
如果一個私有欄位從未被分配,它會導致CS0649警告。然而,如果該欄位是公共的,或者在類的任何地方被修改,這個警告就不會出現。例如,下面的代碼是完全可以接受的,而且不應該引起警告:
public class MyClass{
private long myLong;
public void Increment() => myLong 。
}
如果該欄位只能從建構式中設定,你應該將其宣告為只讀。然而,公共的只讀欄位并不觸發警告,即使它們可能應該。參見為什么我沒有收到關于未初始化的只讀欄位的警告?.
。uj5u.com熱心網友回復:
反正這些欄位不是屬性。這不僅僅是語意上的問題。欄位是實作細節,甚至是公共欄位。它們不被視為類的 API 表面的一部分。屬性是API 的一部分,它們被所有序列化器默認序列化(欄位不被序列化)并保證事實上擁有公共欄位是一種代碼氣味。
為了確保所有的屬性被初始化,你可以使用 這就生成了一個類,該類對
標籤: 下一篇:決議包含特殊檔案夾的字串
long是一個值型別,不能為空。值型別在宣告時總是被初始化,有一個默認值,在這個例子中是0。如果你想存盤一個null,你必須把field的型別改為long?
record型別而不是class :public record(string PropertyOne。long PropertyTwo)。
PropertyOne和PropertyTwo只有初始屬性,而建構式則需要所有屬性的值。還有平等運算子、解構器和一個ToString()實作,它以JSON字串的形式回傳所有屬性。
