如何使我的字符串 属性 可为空?

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# 作为一种语言从现代语言中“有点”过时并且具有误导性。

例如在 typescriptswift 中有一个“?”明确地说它是可空类型,要小心。它非常清晰而且很棒。 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>