我很新的C#,所以请多多包涵......
我执行的部分类,并想补充像这样两个属性:
public partial class SomeModel
{
public bool IsSomething { get; set; }
public List<string> SomeList { get; set; }
... Additional methods using the above data members ...
}
我想这两个数据成员初始化: IsSomething
到True
和SomeList
到new List<string>()
通常我会做一个构造函数,但是因为它是一个局部类我不想碰的构造(应该吧?)。
什么是实现这一目标的最佳方式是什么?
谢谢
PS我在ASP.NET MVC工作,将功能添加AA一定的模式,因此部分类。
Answer 1:
更新了C#6
C#6已经加入到分配一个默认值,以自动性质的能力。 该值可以是任何表达(它不必是一常数)。 下面是几个例子:
// Initialize to a string literal
public string SomeProperty {get;set;} = "This is the default value";
// Initialize with a simple expression
public DateTime ConstructedAt {get;} = DateTime.Now;
// Initialize with a conditional expression
public bool IsFoo { get; } = SomeClass.SomeProperty ? true : false;
原来的答案
自动实现的属性可在类的构造函数初始化,而不是在属性格式本身。
public SomeModel
{
IsSomething = false;
SomeList = new List<string>();
}
...或者你可以使用一个字段支持的属性(略多的工作),并初始化场本身...
private bool _IsSomething = false;
public bool IsSomething
{
get { return _IsSomething; }
set { _IsSomething = value; }
}
更新:我上面的回答没有说明这个存在的问题在部分类。 迈赫达德的答案提供使用部分的方法,这是我的第一个建议行的解决方案。 (手动实现的属性?)我使用非自动实现的属性的第二个建议将这种情况下工作。
Answer 2:
第一属性(IsSomething)是一个布尔值。 这将是默认为false。
第二个属性,因为它是一个引用类型,默认为空,而不需要您的任何努力。 你并不需要接触的构造,因为引用类型(类)将自动开始在.NET空。
如果你想使用非默认值,你有两个选择 -
首先,使用后备存储领域:
private bool isSomething = true;
public bool IsSomething {
get { return this.isSomething; }
set { this.isSomething = value; }
}
第二个方案 - 将它添加到构造函数。
注意,第一个选项没有额外的开销 - 它基本上是当您使用自动属性,编译器做什么。
Answer 3:
你不能在一个分部类两个部分组成两个构造函数。 但是,你可以用局部的方法来完成类似的东西:
// file1:
partial void Initialize();
public Constructor() {
// ... stuff ... initialize part 1
Initialize();
}
// file2:
void Initalize() {
// ... further initializations part 2 might want to do
}
如果部分类的任何部分限定的部分的方法,它的所有呼叫将被省略。
Answer 4:
警告WCF的部分类的用户
如果你想将属性添加到WCF代理类(由产生的添加服务引用),你可能会惊讶地发现,私有字段没有初始化,因为显然根本没有构造函数被调用 。
如果你试图做到这一点(如在一些其他答案建议),它永远不会被调用:
private bool _sendEmail = true;
这有什么好做的领域是否在部分类与否。
什么,你需要做的就是添加[OnDeserialized]属性,它可以让你做进一步的初始化的对象。 这是System.Runtime.Serialization的一部分使用时,以便仅在序列的上下文中有用的DataContractSerializer 。
public partial class EndOfDayPackageInfo
{
[OnDeserialized()]
public void Init(StreamingContext context)
{
_sendEmail = true;
}
private bool _sendEmail;
public bool SendEmail
{
get
{
return _sendEmail;
}
set
{
_sendEmail = value;
RaisePropertyChanged("SendEmail");
}
}
}
另一种方法是“懒加载”属性 - 但这种方法是优雅的要少得多。
private bool _sendEmail;
private bool _sendEmailInitialized;
public bool SendEmail
{
get
{
if (!_sendEmailInitialized)
{
_sendEmailInitialized = true;
_sendEmail = true; // default value
}
return _sendEmail;
}
set
{
if (!_sendEmailInitialized)
{
// prevent unwanted initialization if 'set' is called before 'get'
_sendEmailInitialized = true;
}
_sendEmail = value;
RaisePropertyChanged("SendEmail");
}
}
Answer 5:
对此,不使用自动属性,但旧的方式
YourType _yourParameter = yourDefaultValue;
public YourType YourParameter
{
get{return _yourParameter;}
set{_yourParameter=value;}
}
Answer 6:
对于C#的6.0版本的用户,它可以初始化像这样的属性:
public bool IsSomething { get; set; } = true;
public List<string> SomeList { get; set; } = new List<string>();
Answer 7:
无论你的属性将得到你需要的默认值。
没有什么错在部分类有一个构造函数。 部分类绝不特殊,除了一个事实,即它们的源代码在多个文件/声明蔓延。
Answer 8:
private bool _InternalUserContactUpdate = false;
public bool InternalUserContactUpdate
{
get { return _InternalUserContactUpdate; }
set { _InternalUserContactUpdate = value; }
}
然后,当你希望覆盖条件的值,
if(!objUserModel.FirstName.ToLower().Equals(entry.Key[0].Attributes.Contains("firstname").ToString().ToLower()))
{
objUserModel.InternalUserContactUpdate= true;
}
希望这将有助于
文章来源: C#: How to set default value for a property in a partial class?