【问题标题】:How can I make my string property nullable?如何使我的字符串属性可以为空?
【发布时间】:2015-12-27 11:52:46
【问题描述】:

我想将人的中间名 (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# asp.net-mvc entity-framework entity-framework-migrations


【解决方案1】:

String 是一个引用类型并且总是可以为空的,你不需要做任何特别的事情。只有值类型才需要指定类型可以为空。

【讨论】:

  • 这对于 c# 8+ 来说并不完全正确。在 c# 8+ 中,字符串仍然可以为空,但使用 #nullable enable 您也可以对字符串使用可空运算符。
  • 在 C# 8.0 中,引用类型可能被标记为可为空。可以键入string? 告诉全世界这个字符串可能为空。参考:youtube.com/watch?v=VdC0aoa7ung
  • @cahit,你的意思是空合并运算符吗?您可以在不指定可为空字符串的情况下使用它。
【解决方案2】:

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;
    }
}}

您还可以查看来自 John Skeet 的 this nice article,其中解释了详细信息。

【讨论】:

  • 那段代码可以在 c# 8.0 之前运行,不是吗?它只是为属性分配一些空值。
  • 在 c# 8.0 的早期版本中,您不能使引用类型为空。
  • 我认为@ShahryarSaljoughi 的观点是您的代码没有使用新的string? 类型。
【解决方案3】:

System.String 是一个引用类型,所以你不需要做任何类似的事情

Nullable<string>

它已经有一个空值(空引用):

string x = null; // No problems here

【讨论】:

    【解决方案4】:

    无论如何,字符串在 C# 中都是可以为空的,因为它们是引用类型。你可以只使用public string CMName { get; set; },你就可以将它设置为null。

    【讨论】:

    • 每个类型都是 C# 中的一个对象(通过继承)。 strings 可以为空的原因是它们是引用类型的实例。
    • 谢谢,这是一个有用的说明。我已经相应地更新了我的答案。
    【解决方案5】:

    这个问题已经有一段时间了,C# 变化不大,但变得更好了。看看Nullable reference types (C# reference)

    string notNull = "Hello";
    string? nullable = default;
    notNull = nullable!; // null forgiveness
    

    C# 作为一种语言,与现代语言相比“有点”过时了,并具有误导性。

    例如在typescriptswift 中有一个“?”要清楚地说它是一个可为空的类型,请小心。这很清楚,而且很棒。 C#没有/没有这个能力,结果,一个简单的合同IPerson很容易误导人。根据 C# FirstName 和 LastName 可以为空,但这是真的吗?每个业务逻辑 FirstName/LastName 真的可以为空吗?答案是我们不知道,因为 C# 没有能力直接说出来。

    interface IPerson
    {
      public string FirstName;
      public string LastName;
    }
    

    【讨论】:

    • 您省略了最重要的部分,即现在可以使 C# 可以为空。
    【解决方案6】:

    不可能使引用类型为 Nullable。在 Nullable 结构中只能使用值类型。将问号附加到值类型名称使其可以为空。这两行是一样的:

    int? a = null;
    Nullable<int> a = null;
    

    【讨论】:

    • 不可能将引用类型设为 Nullable 所有引用类型都可以隐式地为 null。这充其量是误导
    【解决方案7】:

    正如其他人所指出的,字符串在 C# 中始终可以为空。我怀疑您在问这个问题是因为您不能将中间名留空或留空? 我怀疑问题出在您的验证属性上,很可能是正则表达式。我无法在脑海中完全解析 RegEx,但我认为您的 RegEx 坚持第一个字符存在。我可能是错的——RegEx 很难。无论如何,请尝试注释掉您的验证属性并查看它是否有效,然后一次将它们添加回来。

    【讨论】:

      【解决方案8】:

      string 类型是引用类型,因此默认可以为空。您只能将 Nullable&lt;T&gt; 与值类型一起使用。

      public struct Nullable<T> where T : struct
      

      这意味着泛型参数无论替换什么类型,它都必须是值类型。

      【讨论】:

      • 我认为您的意思是值类型类型而不是结构?
      【解决方案9】:

      string 默认为 Nullable ,你不需要做任何事情来使 string 为 Nullable

      【讨论】:

        【解决方案10】:

        您无需执行任何操作,Model Binding 将毫无问题地将null 传递给属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          • 1970-01-01
          • 2021-03-28
          • 2021-08-09
          相关资源
          最近更新 更多