我有一个只读对象,但它的属性在某处得到更新。是否C#有任何限制也可以通过直接更改和反射来限制?
这是POC代码
class Program
{
static void Main(string[] args)
{
ReadOnlyCreator tester = new ReadOnlyCreator();
tester.ModifyTester();
Console.ReadLine();
}
}
class ClassUnderTest
{
public string SomeProp { get; set; }
}
class ReadOnlyCreator
{
private readonly ClassUnderTest _classUnderTest;
public ReadOnlyCreator()
{
_classUnderTest = new ClassUnderTest { SomeProp = "Init" };
}
public void ModifyTester()
{
Console.WriteLine("Before: " + _classUnderTest.SomeProp);
var modifier = new Modifier(_classUnderTest);
modifier.Modify();
Console.WriteLine("After: " + _classUnderTest.SomeProp);
}
}
class Modifier
{
private ClassUnderTest _classUnderTest;
public Modifier(ClassUnderTest classUnderTest)
{
_classUnderTest = classUnderTest;
}
public void Modify()
{
_classUnderTest.SomeProp = "Modified";
}
Run Code Online (Sandbox Code Playgroud)
如果你想要一个只读对象,你应该让它只读。IE
class ClassUnderTest
{
public string SomeProp { get; }
public ClassUnderTest(string someProp) => SomeProp = someProp;
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 c#9,您也可以使用init only setter。这允许仅在构造对象期间设置属性:
class ClassUnderTest
{
public string SomeProp { get; init; }
}
Run Code Online (Sandbox Code Playgroud)
如果您使用值类型,您可以(并且应该)将整个类型声明为只读。另请参阅在类和结构之间进行选择
public readonly struct StructUnderTest
Run Code Online (Sandbox Code Playgroud)
这不能防止反射或不安全的代码。使用这些功能是故意规避规则,因此由开发人员来确保其安全。