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,可能会混淆需要