gpt4 book ai didi

c# - 我应该让我的对象属性可以为 null 还是为每种类型使用 CLR 默认值?

转载 作者:太空狗 更新时间:2023-10-29 18:32:58 27 4
gpt4 key购买 nike

我一直在努力找出处理默认值的最佳方式。将 ID 值设置为 0 是有道理的,但是如果它是货币值或其他初始未设置的值,当您稍后在代码中遇到它时,无法判断它是否已设置或已设置为 0。如果一个 money 值被设置为 null,那么你就知道它还没有被设置。此外,在处理数据库时,很容易知道是否需要向字段写入空值,而不是试图弄清楚它是否应该为空。

可接受的处理方式是什么?

Class MyModel
{
public int Id {get;set;}
public string Title {get;set;}
public DateTime CreatedDate {get;set;}
public bool IsActive {get;set;}

//CLR will automatically set these values
Public MyModel()
{
Id = 0;
Title = String.Empty;
CreatedDate = "1/1/0001";
IsActive = false;
}
}

对比

Class MyModel
{
public int? Id {get;set;}
public string Title {get;set;}
public DateTime? CreatedDate {get;set;}
public bool? IsActive {get;set;}

//CLR will automatically set these values
Public MyModel()
{
Id = null;
Title = null;
CreatedDate = null;
IsActive = null;
}
}

最佳答案

您始终可以根据您的领域混合使用方法。

static class ID
{
public const int Unassigned = -1;
}

class MyModel
{
public int Id { get; private set; }
public string Title { get; set; }
public DateTime CreatedDate { get; set; }
public bool IsActive { get; set; }
public bool? IsAwesome { get; set; }

Model ()
{
// you may use "default" constants...
Id = ID.Unassigned;
}

// you may use optional parameters or overloads
public MyModel (string title,
DateTime created = DateTime.Now, // default values may be concrete
bool? isAwesome = null) // or nullable as well
: this () // and you can chain-call constructors!
{
Title = title ?? "<no title>"; // you don't always want null to come through
CreatedDate = created;
IsAwesome = isAwesome;
}
}

// Possible usages:
var model = new MyModel ("Hello", new DateTime (2001, 1, 1));
var model = new MyModel ("world", isAwesome: true);
var model = new MyModel (null) {
IsActive = true
};

某些属性具有 null 值可能是有意义的,例如“未设置”。

在您的示例中,模型在持久化到数据库之前可能真的没有 Id。如果是这种情况,并且无 ID 模型在业务逻辑方面有意义,则可为空的 Id 优于 Id = 0 .但是,如果您的应用程序从不使用无 id 模型,并且通常期望 Id 等于某个值,那么编写

会很疯狂
if (model.Id != null)

每次你想用它做点什么。

在这种情况下,您可能应该默认使用 Id = 0
您也可以引入一个常量(正如我在上面所做的那样),尽管我不会推荐它用于除 ID 之外的任何东西,并且只有在它们被其他地方的代码大量使用的情况下。

同样,一切都取决于域。
您的工作是确保不会轻易创建违反业务规则的对象。

关于c# - 我应该让我的对象属性可以为 null 还是为每种类型使用 CLR 默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6496569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com