相关疑难解决方法(0)

如何在C#中创建不可变对象?

在关于C#模式验证的最佳实践的问题中,最高投票的答案是:

我倾向于在构造函数中执行所有验证.这是必须的,因为我几乎总是创建不可变对象.

你究如何在C#中创建一个不可变对象?你刚才用readonly关键字吗?

如果要在Entity Framework生成的模型类的构造函数中进行验证,这究竟是如何工作的?

它看起来像下面?

public partial readonly Person
{
    public Person()
}
Run Code Online (Sandbox Code Playgroud)

c# validation immutability entity-framework-4

31
推荐指数
4
解决办法
3万
查看次数

C#中的不可变类型和属性

C#中的不可变类型和不可变属性是什么意思?你能举一个简单的例子吗?

c# types immutability

24
推荐指数
2
解决办法
1万
查看次数

添加到IEnumerable的代码

我有一个这样的调查员

IEnumerable<System.Windows.Documents.FixedPage> page;
Run Code Online (Sandbox Code Playgroud)

如何添加页面(例如:D:\newfile.txt)?我已经试过Add,Append,Concat等但没有为我工作.

c# ienumerable add

22
推荐指数
4
解决办法
5万
查看次数

C#如何创建类的特殊实例?

对于某些类,理想情况下,我想创建特殊的命名实例,类似于"null".据我所知,这是不可能的,所以相反,我使用静态构造函数创建类的静态实例,类似于:

public class Person
{
    public static Person Waldo;  // a special well-known instance of Person
    public string name;
    static Person()  // static constructor
    {
        Waldo = new Person("Waldo");
    }
    public Person(string name)
    {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Person.Waldo是Person类的一个特殊实例,我创建它是因为在我的程序中,有很多其他类可能想要引用这个特殊的着名实例.

实现这种方式的缺点是我不知道如何使Person.Waldo的所有属性都是不可变的,而"普通"Person实例的所有属性都应该是可变的.每当我不小心有一个Person对象指向Waldo时,我不小心不检查它是否指的是Waldo,那么我不小心破坏了Waldo的属性.

是否有更好的方法,甚至是一些其他替代方法来定义类的特殊知名实例?

我现在知道的唯一解决方案是实现get和set访问器,并检查每个集合上的"if(this == Waldo)throw new ...".虽然这有效,但我认为C#可以比我实现它做得更好.如果只有我能找到一些C#方式来使得Waldo的所有属性只读(除了在静态构造函数中).

c# class instance named

6
推荐指数
2
解决办法
408
查看次数

如何让班级真正变化?

我刚刚研究IReadOnlyList<T>创建只读列表.但我认为这不是100%只读.我无法在列表中添加/删除项目,但我仍然可以修改成员.

考虑这个例子.

class Program
{
    static void Main(string[] args)
    {
        List<Test> list = new List<Test>();
        list.Add(new Test() { MyProperty = 10 });
        list.Add(new Test() { MyProperty = 20 });

        IReadOnlyList<Test> myImmutableObj = list.AsReadOnly();

        // I can modify the property which is part of read only list
        myImmutableObj[0].MyProperty = 30;
    }
}

public class Test
{
    public int MyProperty { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

为了使它真正只读,我必须MyProperty做为readonly.这是一个自定义类,可以修改类.如果我的列表是内置的.net类,它具有getter和setter属性怎么办?我认为在这种情况下我必须编写一个.net类的包装器,它只允许读取值.

有没有办法让现有的类不可变?

.net c# c#-3.0 c#-4.0

1
推荐指数
1
解决办法
1097
查看次数