C#:如何设置分部类中属性的默认值?

C#:如何设置分部类中属性的默认值?,c#,properties,default,partial-classes,C#,Properties,Default,Partial Classes,我对C#很陌生,所以请容忍我 我正在实现一个分部类,并希望添加如下两个属性: public partial class SomeModel { public bool IsSomething { get; set; } public List<string> SomeList { get; set; } ... Additional methods using the above data members ... } 公共部分类模型 { 公共布尔值是某物{

我对C#很陌生,所以请容忍我

我正在实现一个分部类,并希望添加如下两个属性:

public partial class SomeModel
{
    public bool IsSomething { get; set; }
    public List<string> SomeList { get; set; }

    ... Additional methods using the above data members ...
}
公共部分类模型
{
公共布尔值是某物{get;set;}
公共列表SomeList{get;set;}
…使用上述数据成员的其他方法。。。
}
我想初始化这两个数据成员:
IsSomething
True
SomeList
newlist()
。通常我会在构造函数中完成,但是因为它是一个分部类,所以我不想接触构造函数(我应该吗?)

实现这一目标的最佳方式是什么

谢谢

PS我在ASP.NETMVC中工作,为某个模型添加功能,因此是分部类

第一个属性(IsSomething)是布尔值。默认情况下,它将为false

第二个属性,因为它是引用类型,将默认为null,而无需您的任何努力。您不需要接触构造函数,因为引用类型(类)在.NET中会自动以null开头

如果要使用非默认值,有两个选项-

首先,使用备份存储字段:

private bool isSomething = true;
public bool IsSomething {
    get { return this.isSomething; }
    set { this.isSomething = value; }
}
第二个选项-将其添加到构造函数中

请注意,第一个选项没有额外的开销-这基本上是编译器在使用自动属性时所做的操作。

为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>();
}

更新:我的上述回答并没有澄清部分课程的问题。提供了使用分部方法的解决方案,这与我的第一个建议一致。我的第二个建议是使用非自动实现的属性(手动实现的属性?)将适用于这种情况。

您的两个属性都已具有所需的默认值


在分部类中使用构造函数没有什么错。除了源代码分布在多个文件/声明中之外,分部类没有任何特殊之处。

分部类的两个部分中不能有两个构造函数。但是,您可以使用来完成类似的任务:

// file1:
partial void Initialize();
public Constructor() {
    // ... stuff ... initialize part 1
    Initialize();
}

// file2:
void Initalize() {
    // ... further initializations part 2 might want to do
}

如果分部类的任何部分都没有定义分部方法,那么对它的所有调用都将被忽略。

对此,不要使用automatic属性,而是使用旧方法

YourType _yourParameter = yourDefaultValue;
public YourType YourParameter
{
   get{return _yourParameter;}
   set{_yourParameter=value;}
}

针对WCF分部类用户的警告

如果您试图将属性添加到WCF代理类(由add Service Reference生成),您可能会惊讶地发现私有字段没有初始化,因为显然是这样

如果您尝试这样做(如其他一些答案中所建议的),它将永远不会被调用:

    private bool _sendEmail = true;
这与字段是否在分部类中无关

您需要做的是添加一个属性,该属性允许您对对象进行进一步初始化。这是System.Runtime.Serialization的一部分,因此仅在使用时在序列化上下文中有用

}

另一种方法是“延迟加载”属性,但这种方法不那么优雅

    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");
        }
    }

对于C#6.0版的用户,可以如下初始化属性:

public bool IsSomething { get; set; } = true;
public List<string> SomeList { get; set; } = new List<string>();
public bool IsSomething{get;set;}=true;
public List SomeList{get;set;}=new List();
然后,当您要覆盖条件上的值时

if(!objUserModel.FirstName.ToLower().Equals(entry.Key[0].Attributes.Contains("firstname").ToString().ToLower()))
        {
             objUserModel.InternalUserContactUpdate= true;
        }


希望这会有所帮助

这些已经是这些类型的默认值。你什么都不需要做,我想说清楚。如果我想要“True”或“new List()”?我编辑这个问题是为了反映不是“自然”默认值的值。您必须使用一个备份存储字段,并内联初始化它,或者将它放入构造函数中。@John:您不需要做任何事——只要您希望调用方/客户端为您初始化SomeList属性;)SomeList=新列表**()**;关于你的第一个建议,这样做是否被视为“良好做法”?这当然会更容易,但感觉像是“代码气味”…@RaxL我对它的气味持怀疑态度。初始化逻辑是OO开发中相当正常的一部分;如果在系统上工作的开发人员遵循相同的实践,那么我不认为这是一个问题。请注意,在自动生成的类中添加任何代码(包括此答案)都会在模型刷新后被删除。@H35am您永远不应该修改生成的类(脚手架是另一回事——您永远不会“刷新”或者重新生成脚手架)正如Reed在他的评论中指出的,值类型将使用默认值(0表示int,false表示bool…)初始化,但引用类型将初始化为null/Nothing。所以在他的例子中是something=false和sometlist=null@Yooder:此答案是在问题仍然要求默认值为False和null时提供的。请收回你的-1,这对比赛中途移动球门是不公平的?不公平+1用于指出值/引用类型的不同行为。多么有趣。从一个扭曲的角度讲是有道理的。是的,但一开始很混乱。今天才发现这一点,并认为这是WPF绑定问题,直到我最终意识到这是WCF。事实证明,他们调用这个方法绕过了调用任何构造函数:谢谢,这正是我的问题。什么是RaisePropertyChange方法?此方法是否来自.net framework?唉,如果类中具有构造函数的部分是生成的代码,则此方法没有帮助。
public bool IsSomething { get; set; } = true;
public List<string> SomeList { get; set; } = new List<string>();
 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;
        }