如何使我的字符串 属性 可为空?
How can I make my string property nullable?
我想让人的中间名 (CMName
) 可选。我一直在使用 C#.net 代码优先方法。对于整数数据类型,只需使用 ?
运算符即可轻松实现可为空。我正在寻找一种使我的 sting 变量可为空的方法。我尝试搜索但找不到使其可为空的方法。
下面是我的代码。请建议我如何让它可以为空。
public class ChildrenInfo
{
[Key]
public int ChidrenID { get; set; }
[Required]
[Display(Name ="First Name")]
[StringLength(50,ErrorMessage ="First Name cannot exceed more than 50 characters")]
[RegularExpression(@"^[A-Z]+[a-z]*$",ErrorMessage ="Name cannot have special character,numbers or space")]
[Column("FName")]
public string CFName { get; set; }
[Display(Name ="Middle Name")]
[RegularExpression(@"^[A-Z]+[a-z]*$",ErrorMessage ="Middle Name cannot have special character,numbers or space")]
[StringLength(35,ErrorMessage ="Middle Name cannot have more than 35 characters")]
[Column("MName")]
public string CMName { get; set; }
}
无论如何,字符串在 C# 中是可以为 null 的,因为它们是引用类型。您可以只使用 public string CMName { get; set; }
并将其设置为 null。
string
类型是引用类型,因此默认情况下可以为空。您只能将 Nullable<T>
与值类型一起使用。
public struct Nullable<T> where T : struct
也就是说泛型参数无论替换成什么类型,都必须是值类型
String 是一个引用类型并且始终可以为空,您不需要做任何特殊的事情。只有值类型才需要指定类型可为空。
无法使引用类型为 Nullable。 Nullable 结构中只能使用值类型。将问号附加到值类型名称使其可为空。这两行是一样的:
int? a = null;
Nullable<int> a = null;
正如其他人指出的那样,字符串在 C# 中始终可以为空。我怀疑您问这个问题是因为您无法将中间名保留为空或空白?
我怀疑问题出在您的验证属性上,很可能是 RegEx。我无法在脑海中完全解析 RegEx,但我 认为 你的 RegEx 坚持要出现第一个字符。我可能是错的——正则表达式很难。在任何情况下,尝试注释掉您的验证属性并查看它是否有效,然后一次将它们添加回去。
您不需要做任何事情,Model Binding
会毫无问题地将 null
传递给 属性。
System.String 是一个引用类型,所以你不需要做任何像
Nullable<string>
它已经有一个空值(空引用):
string x = null; // No problems here
C# 8.0 现已发布,因此您也可以使引用类型可为空。为此你必须添加
#nullable enable
在您的命名空间上的功能。很详细here
例如像这样的东西会起作用:
#nullable enable
namespace TestCSharpEight
{
public class Developer
{
public string FullName { get; set; }
public string UserName { get; set; }
public Developer(string fullName)
{
FullName = fullName;
UserName = null;
}
}}
您还可以看看 this nice article 来自 John Skeet 的详细解释。
string 默认是 Nullable 的,你不需要做任何事情来让 string 可以为 Nullable
问这个问题已经有一段时间了,C# 没有太大变化,但变得更好了。看看Nullable reference types (C# reference)
string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness
C# 作为一种语言从现代语言中“有点”过时并且具有误导性。
例如在 typescript
、swift
中有一个“?”明确地说它是可空类型,要小心。它非常清晰而且很棒。 C#不t/didn没有这个能力,因此,一个简单的契约IPerson非常具有误导性。根据 C#,FirstName 和 LastName 可能为空,但这是真的吗?每个业务逻辑 FirstName/LastName 真的可以为空吗?答案是我们不知道,因为 C# 没有直接说出来的能力。
interface IPerson
{
public string FirstName;
public string LastName;
}
据我所知,这只是一个警告。您仍然可以将字符串设置为 null,代码仍会编译并且 运行.
要为整个项目禁用这些警告,您可以在 .csproj 文件中将 Nullable 标志设置为禁用,如下所示:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<Nullable>disable</Nullable>
</PropertyGroup>
我想让人的中间名 (CMName
) 可选。我一直在使用 C#.net 代码优先方法。对于整数数据类型,只需使用 ?
运算符即可轻松实现可为空。我正在寻找一种使我的 sting 变量可为空的方法。我尝试搜索但找不到使其可为空的方法。
下面是我的代码。请建议我如何让它可以为空。
public class ChildrenInfo
{
[Key]
public int ChidrenID { get; set; }
[Required]
[Display(Name ="First Name")]
[StringLength(50,ErrorMessage ="First Name cannot exceed more than 50 characters")]
[RegularExpression(@"^[A-Z]+[a-z]*$",ErrorMessage ="Name cannot have special character,numbers or space")]
[Column("FName")]
public string CFName { get; set; }
[Display(Name ="Middle Name")]
[RegularExpression(@"^[A-Z]+[a-z]*$",ErrorMessage ="Middle Name cannot have special character,numbers or space")]
[StringLength(35,ErrorMessage ="Middle Name cannot have more than 35 characters")]
[Column("MName")]
public string CMName { get; set; }
}
无论如何,字符串在 C# 中是可以为 null 的,因为它们是引用类型。您可以只使用 public string CMName { get; set; }
并将其设置为 null。
string
类型是引用类型,因此默认情况下可以为空。您只能将 Nullable<T>
与值类型一起使用。
public struct Nullable<T> where T : struct
也就是说泛型参数无论替换成什么类型,都必须是值类型
String 是一个引用类型并且始终可以为空,您不需要做任何特殊的事情。只有值类型才需要指定类型可为空。
无法使引用类型为 Nullable。 Nullable 结构中只能使用值类型。将问号附加到值类型名称使其可为空。这两行是一样的:
int? a = null;
Nullable<int> a = null;
正如其他人指出的那样,字符串在 C# 中始终可以为空。我怀疑您问这个问题是因为您无法将中间名保留为空或空白? 我怀疑问题出在您的验证属性上,很可能是 RegEx。我无法在脑海中完全解析 RegEx,但我 认为 你的 RegEx 坚持要出现第一个字符。我可能是错的——正则表达式很难。在任何情况下,尝试注释掉您的验证属性并查看它是否有效,然后一次将它们添加回去。
您不需要做任何事情,Model Binding
会毫无问题地将 null
传递给 属性。
System.String 是一个引用类型,所以你不需要做任何像
Nullable<string>
它已经有一个空值(空引用):
string x = null; // No problems here
C# 8.0 现已发布,因此您也可以使引用类型可为空。为此你必须添加
#nullable enable
在您的命名空间上的功能。很详细here
例如像这样的东西会起作用:
#nullable enable
namespace TestCSharpEight
{
public class Developer
{
public string FullName { get; set; }
public string UserName { get; set; }
public Developer(string fullName)
{
FullName = fullName;
UserName = null;
}
}}
您还可以看看 this nice article 来自 John Skeet 的详细解释。
string 默认是 Nullable 的,你不需要做任何事情来让 string 可以为 Nullable
问这个问题已经有一段时间了,C# 没有太大变化,但变得更好了。看看Nullable reference types (C# reference)
string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness
C# 作为一种语言从现代语言中“有点”过时并且具有误导性。
例如在 typescript
、swift
中有一个“?”明确地说它是可空类型,要小心。它非常清晰而且很棒。 C#不t/didn没有这个能力,因此,一个简单的契约IPerson非常具有误导性。根据 C#,FirstName 和 LastName 可能为空,但这是真的吗?每个业务逻辑 FirstName/LastName 真的可以为空吗?答案是我们不知道,因为 C# 没有直接说出来的能力。
interface IPerson
{
public string FirstName;
public string LastName;
}
据我所知,这只是一个警告。您仍然可以将字符串设置为 null,代码仍会编译并且 运行.
要为整个项目禁用这些警告,您可以在 .csproj 文件中将 Nullable 标志设置为禁用,如下所示:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<Nullable>disable</Nullable>
</PropertyGroup>