-->

C#:如何在一个局部类的属性设置默认值?(C#: How to set default value

2019-09-23 11:42发布

我很新的C#,所以请多多包涵......

我执行的部分类,并想补充像这样两个属性:

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

    ... Additional methods using the above data members ...
}

我想这两个数据成员初始化: IsSomethingTrueSomeListnew 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?