我在一些项目的过程中开发了一种用于创建不可变(只读)对象和不可变对象图的模式.不可变对象具有100%线程安全的优点,因此可以跨线程重用.在我的工作中,我经常在Web应用程序中使用此模式来配置设置以及我在内存中加载和缓存的其他对象.缓存对象应始终是不可变的,因为您希望保证它们不会意外更改.
现在,您可以轻松地设计不可变对象,如下例所示:
public class SampleElement
{
private Guid id;
private string name;
public SampleElement(Guid id, string name)
{
this.id = id;
this.name = name;
}
public Guid Id
{
get { return id; }
}
public string Name
{
get { return name; }
}
}
Run Code Online (Sandbox Code Playgroud)
这对于简单的类来说很好 - 但是对于更复杂的类,我不喜欢通过构造函数传递所有值的概念.在属性上设置setter是更理想的,构建新对象的代码更容易阅读.
那么如何使用setter创建不可变对象?
好吧,在我的模式中,对象开始是完全可变的,直到你用一个方法调用冻结它们.一旦一个对象被冻结,它将永远保持不变 - 它不能再次变成一个可变对象.如果您需要对象的可变版本,则只需克隆它即可.
好的,现在谈谈一些代码.我在下面的代码片段中试图将模式简化为最简单的形式.IElement是所有不可变对象必须最终实现的基接口.
public interface IElement : ICloneable
{
bool IsReadOnly { get; }
void MakeReadOnly();
}
Run Code Online (Sandbox Code Playgroud)
Element类是IElement接口的默认实现:
public abstract class Element : IElement
{
private bool immutable;
public …Run Code Online (Sandbox Code Playgroud) 我正在开发一个工具,我需要将字符串值转换为正确的对象类型.例如,将字符串转换"2008-11-20T16:33:21Z"为DateTime值.数值喜欢"42"和"42.42"必须转换成一个Int32值和Double分别值.
检测字符串是整数还是数字的最佳和最有效的方法是什么?是Int32.TryParse或Double.TryParse要走的路?
我创建了一些基于PHP的Intranet资源,要求用户登录.用户创建自己的登录,并验证他们是否使用cookie登录.
我被问到是否可以将该登录绑定到他们的Windows登录名.我最初的回答是"网页无法访问您的Windows登录 - 这将带来安全风险." 但我们的一个部门使用Sharepoint,事实上它确实与Windows登录相关联.
怎么做的?我可以用PHP做吗?如果是这样,为什么它不是一个可怕的安全漏洞?
为什么从程序员的角度来了解虚拟化有帮助?除了在几个不同的平台上进行测试和开发而不需要在操作系统之间切换之外,虚拟化对程序员来说很重要吗?在开发虚拟实例之前是否还必须牢记任何细节?
您需要在防火墙中打开哪些端口才能将远程Windows计算机连接到该防火墙后面的Microsoft Active Directory服务器域?
我想按“浏览次数最多”订购在内容查询 Web 部件内显示的一组网页我知道 sharepoint 会跟踪此类内容,但我不知道如何将此列表公开给内容查询 Web 部件 - 谁能指出我的方向正确吗?
提前致谢
c# ×2
sharepoint ×2
.net ×1
firewall ×1
immutability ×1
login ×1
php ×1
port ×1
ports ×1
reporting ×1
string ×1
value-type ×1
windows ×1