gpt4 book ai didi

c# - 使用显式接口(interface)防止意外修改 C# 中的属性

转载 作者:行者123 更新时间:2023-11-30 22:48:22 28 4
gpt4 key购买 nike

我偶然发现了一个我以前没有注意到的 C# 方法解析的特性。也就是说,当我显式实现一个支持 setter 的接口(interface),而隐式接口(interface)只提供一个 protected 集时,编译器在我调用它时会明智地遵从 protected 集。因此,我获得了自动实现属性的大部分便利,但我可以防止不应该更改字段的客户意外修改字段。

举个例子,

 virtual public DateTime CreatedOn { get; protected set; }
virtual public DateTime? ModifiedOn { get; protected set; }
#region IHaveUpdateDateFields Members

DateTime IHaveUpdateDateFields.CreatedOn
{
get
{
return this.CreatedOn;
}
set
{
this.CreatedOn = value;
}
}

DateTime? IHaveUpdateDateFields.ModifiedOn
{
get
{
return this.ModifiedOn;
}
set
{
this.ModifiedOn = value;
}
}

然后我的模型绑定(bind)代码不会意外设置日期,但我的 ORM 事件监听器可以检查实现 IHaveUpdateDateFields 的实体并在持久化我的实体时设置日期。

我的问题是:

  1. 我是否依赖定义的行为,或者我是否保证所有 C# 编译器都将以这种方式解析方法?例如,我不想发现 C# 标准说这种方法解析是未定义的,然后在为 Mono 构建时意外出现可怕的堆栈溢出。
  2. 有没有更好(最好是更简洁)的方法来做到这一点?我可以有一个传递给 Controller ​​的 ModelBinder 安全接口(interface),但这似乎不会节省我的代码,而且我认为它不会提供一种透明的方法来最大限度地减少意外修改属性。

最佳答案

定义非常明确;显式接口(interface)实现在使用接口(interface)时优先,常规属性在其他情况下生效(包括从 get/set 主体内)。

至于让它更整洁......我能提供的最好的办法是重新格式化它以使其不那么冗长......

DateTime IHaveUpdateDateFields.CreatedOn
{
get { return CreatedOn; }
set { CreatedOn = value; }
}

(另请注意,this 是隐式和冗余的)

顺便说一句 - 安全只是一种方便,而不是保证......外部调用者仍然可以使用你的界面,并且通常可以(滥用)使用反射来跳过诸如 protected 之类的东西- 甚至直接设置字段。

关于c# - 使用显式接口(interface)防止意外修改 C# 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1717563/

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