【发布时间】:2016-01-29 01:47:25
【问题描述】:
我试图让一个类只允许在命名空间范围内使用new 关键字进行初始化。虽然我需要能够使用它的 type 示例
namespace MyNameSpace {
class MyClass {
public string Name { get; set; }
}
class NewMyClass {
MyClass cls = new MyClass();
cls.Name = "My Name";
}
}
但在Program.cs 上,我只希望用户能够执行以下操作。
NewMyClass myC = new NewMyClass();
List<MyClass> myList = myC.method();
foreach(MyClass a in myList){
Console.WriteLine(a.property);
}
正如您所希望看到的,我想让他们将其用作数据类型,因为它将是它需要的列表类型。但我不希望用户在MyClass 中设置Name,也不能调用new MyClass。我已经尝试将MyClass 制作成一个接口,但我需要创建新实例来存储在List 中。
我也尝试设置 private set 以便只有 NewMyClass 可以设置它们,但这也不起作用。我已经读了一段时间了,我就是这么卡住了!
我希望用户能够做什么~!
List<MyClass> //use as a datatype
Console.WriteLine(a.property); //call the property from the list
我不希望用户做的事情!
new MyClass();
a.property = "Other Name" //set the value.
原因
用户没有理由调用MyClass,只有NewMyClass 应该调用它。用户也没有理由将值分配给MyClass 中的任何属性。我正在使用一个类,因为我被告知不要使用struct,这没关系,因为到目前为止我喜欢类方法的多功能性。但是我需要对用户进行很多限制。
如果我在这方面做错了,请告诉我,我对 C# 很陌生,所以请不要害怕告诉我你会走哪条路以及为什么这样我可以理解你的推理。
思考的第二步
回到结构体方法。我现在有
internal struct MyClass {
public string Name {get; set;}
}
我喜欢这样做的原因是当我这样做时
MyClass cls = new MyClass();
它给出一个警告,表明 cls 已分配但从未使用过。但是当我们这样做时
cls.Name = "google";
那个警告消失了,我不想让用户设置,但只有我的主类可以这样做。
【问题讨论】:
标签: c# class struct interface access-modifiers