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

时间:2015-09-29 20:47:41

标签: c# asp.net-mvc entity-framework ef-migrations

我想让人的中间名可选。我一直在使用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; }
}   

10 个答案:

答案 0 :(得分:85)

String是一种引用类型,并且始终可以为空,您不需要做任何特殊的事情。只有值类型才需要指定类型可为空。

答案 1 :(得分:8)

System.String是一种引用类型,因此您无需执行任何类似

的操作
Nullable<string>

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

string x = null; // No problems here

答案 2 :(得分:5)

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

答案 3 :(得分: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,并解释细节。

答案 4 :(得分:1)

无法使引用类型为Nullable。只有值类型可以在Nullable结构中使用。将问号添加到值类型名称使其可为空。这两行是相同的:

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

答案 5 :(得分:1)

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

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

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

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

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

答案 6 :(得分:0)

string类型是引用类型,因此默认情况下它是可空的。您只能将Nullable<T>与值类型一起使用。

public struct Nullable<T> where T : struct

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

答案 7 :(得分:0)

正如其他人所指出的,字符串在C#中总是可以为空的。我怀疑你是在问这个问题,因为你不能把中间名留空或空白? 我怀疑问题在于验证属性,很可能是RegEx。我无法完全解析RegEx,但我认为你的RegEx坚持第一个角色出现。我错了 - RegEx很难。在任何情况下,尝试注释掉您的验证属性并查看它是否有效,然后一次一个地添加它们。

答案 8 :(得分:0)

你不需要做任何事情,模型绑定会毫无问题地将null传递给变量。

答案 9 :(得分:0)

字符串默认为Nullable,您无需执行任何操作即可使字符串Nullable