gpt4 book ai didi

c# - Reflection是否违反了封装原则?

转载 作者:行者123 更新时间:2023-12-01 19:53:01 27 4
gpt4 key购买 nike

好吧,假设我们有一个定义如下的类

public class TestClass
{
private string MyPrivateProperty { get; set; }

// This is for testing purposes
public string GetMyProperty()
{
return MyPrivateProperty;
}
}

然后我们尝试:

TestClass t = new TestClass { MyPrivateProperty = "test" };

编译失败,如预期的那样,TestClass.MyPrivateProperty 由于其保护级别而无法访问

尝试

TestClass t = new TestClass();
t.MyPrivateProperty = "test";

编译再次失败,并显示相同的消息。

到目前为止一切都很好,我们都在期待这一点。

但是有人写道:

PropertyInfo aProp = t.GetType().GetProperty(
"MyPrivateProperty",
BindingFlags.NonPublic | BindingFlags.Instance);

// This works:
aProp.SetValue(t, "test", null);

// Check
Console.WriteLine(t.GetMyProperty());

现在,我们成功地更改了私有(private)字段。

仅仅通过反射就能改变某个对象的内部状态,这不是很不正常吗?

编辑:

感谢您到目前为止的回复。对于那些说“你不必使用它”的人:类设计者怎么样,看起来他不能再假设内部状态安全了?

最佳答案

反射通过提供对私有(private)字段和方法的访问来破坏封装原则,但这不是规避封装的第一个或唯一的方法;有人可能会说序列化公开了类的所有内部数据,这些信息通常是私有(private)的。

重要的是要理解封装只是一种技术,它可以使设计行为变得更容易,前提是消费者同意使用您定义的 API。如果有人选择使用反射或任何其他技术来规避您的 API,他们将不再保证您的对象将按照您设计的方式运行。如果有人将 null 值分配给私有(private)字段,他们最好准备好在下次尝试使用您的类时捕获 NullReferenceException!

根据我的经验,编程就是断言和假设。该语言断言约束(类、接口(interface)、枚举),这使得创建隔离行为变得更容易,前提是消费者同意不违反这些边界。

这是一个公平的断言,因为它使分而治之的软件开发方法比之前的任何技术都更加容易。

关于c# - Reflection是否违反了封装原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1796055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com