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

Posted

技术标签:

【中文标题】如何使我的字符串属性可以为空?【英文标题】: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; 
   

【问题讨论】:

What is the difference between a reference type and value type in c#?的可能重复 是时候复习 C# 8.0 的答案并调整正确的答案了。 【参考方案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 传递给属性。

【讨论】:

以上是关于如何使我的字符串属性可以为空?的主要内容,如果未能解决你的问题,请参考以下文章

如果STRING_AGG不为空或NULL,则将CONCAT / CONCAT_WS与STRING_AGG一起使用字符串来结果?

使我的 SSIS 包可移植 - 如何做到这一点?

如何使我的构造函数和函数工作,以便我的main()能够显示字符串和int数据?

SpEL @ConditionalOnProperty 字符串属性为空或 null

不可为空的字符串类型,如何与 Asp.Net Core 选项一起使用

当值为空时如何取消设置属性?