C# 不可为null的属性为null
我有一个非常简单的类C# 不可为null的属性为null,c#,C#,我有一个非常简单的类地址: public class Address { public string Name { get; set; } public string Country { get; set; } } 我将Name声明为string而不是string?,因为它不应该是null 现在我有了一个方法,其中我获取了这个类的一个实例作为参数: public List<Address> SearchAddress(Address search) { ..
地址
:
public class Address
{
public string Name { get; set; }
public string Country { get; set; }
}
我将Name
声明为string
而不是string?
,因为它不应该是null
现在我有了一个方法,其中我获取了这个类的一个实例作为参数:
public List<Address> SearchAddress(Address search)
{
...
if (!search.Name.Equals(string.Empty))
{
temp = query.Where(a => a.Name.Contains(search.Name));
}
...
}
公共列表搜索地址(地址搜索)
{
...
如果(!search.Name.Equals(string.Empty))
{
temp=query.Where(a=>a.Name.Contains(search.Name));
}
...
}
现在我的同事调用了这个方法,我得到了一个System.ArgumentNullException
,因为search.Name
是null
如果我有一个不可为null的int
属性,如果我不给它赋值,我会得到0
作为值
为什么一个不可为空的
字符串属性null
如果没有赋值,而不仅仅是字符串。空的?字符串可以保存空值,就这么简单
字符串是引用类型,但具有值类型的某些行为
请阅读此主题:字符串可以包含空值,就这么简单
字符串是引用类型,但具有值类型的某些行为
请阅读本主题:您可以使用字符串.IsNullOrEmpty
来确定实例是否为Null和空字符串。您可以使用字符串.IsNullOrEmpty
来确定实例是否为Null和空字符串。int
是不可为Null的值类型(即,struct
)。值类型字段将初始化为其默认值。例如,int
为0,bool
为false等。完整列表
当您希望能够将null
赋值给值类型变量时,可以使用null,其中T:struct
或者在int
的情况下,null
/int?
另一方面,string
是一种引用类型。引用类型可以为null,引用类型字段将初始化为null。因此,不允许使用可为null的/字符串?
在您的例子中,您需要检查名称字符串是空的还是空的
if (! String.IsNullOrEmpty(search.Name)) { ... }
int
是一种不可为空的值类型(即struct
)。值类型字段将初始化为其默认值。例如,int
为0,bool
为false等。完整列表
当您希望能够将null
赋值给值类型变量时,可以使用null,其中T:struct
或者在int
的情况下,null
/int?
另一方面,string
是一种引用类型。引用类型可以为null,引用类型字段将初始化为null。因此,不允许使用可为null的/字符串?
在您的例子中,您需要检查名称字符串是空的还是空的
if (! String.IsNullOrEmpty(search.Name)) { ... }
string是引用类型,默认为null。string.empty相当于双引号的空字符串(“”),因此null与string.empty不同。string是引用类型,默认为null。string.empty相当于双引号的空字符串(“”)因此null与String.empty不同。String
是一种引用类型,默认值为null
String
可为null,String?
将不会被编译;如果(!String.IsNullOrEmpty(search.Name)){…},则测试应该是
引用类型总是可以保持null
int
是一种值类型,并且值类型的行为非常不同,将string
与int
进行比较只会让您感到困惑。谢谢,我不知道这一点。但是请告诉我这个问题有什么问题,人们正在否决它,以便我可以编辑它。我试着把它表达得非常一般。String
的可能重复项是一个引用类型,默认值是null
String
可以为null,String?
将不会被编译;您的测试应该是if(!String.IsNullOrEmpty(search.Name)){…}
引用类型总是可以保持null
int
是一种值类型,并且值类型的行为非常不同,将string
与int
进行比较只会让您感到困惑。谢谢,我不知道这一点。但是请告诉我这个问题有什么问题,人们正在否决它,以便我可以编辑它。我试着把它说得非常笼统。可能重复的int?
也是一种值类型。说值类型不能为null,然后说另一种值类型可以为null,这可能会造成不必要的混淆。@hvd很好。据我所知,int?
不能真正为null。所有int?I=null
所做的都是设置值HasValue
属性为false。我将“当您希望值类型为null时”改为“当您希望能够将null赋值给值类型变量时”。现在更清楚了吗?嗯,有点像:int?I=null;object o=I;
将o
设置为null
。之后,I.ToString()
是允许的,但是o.ToString()
不是。但是我更关注的是“int是一种值类型……不能为null”,这强烈地暗示了值类型永远不能为null(就像你说的,有点像真的,但是你也使用null
来表示int?
),我将其重新表述为“int是一种不可为null的值类型”。谢谢你的解释!我不知道这两种类型之间的区别。@hvd同意,我已经编辑了我的答案;)谢谢你的输入int?
也是一种值类型。说值类型不能为null,然后说另一个值类型可以为null,可能会混淆需要