如何使我的字符串属性可以为空?
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# 中的一个对象(通过继承)。string
s 可以为空的原因是它们是引用类型的实例。
谢谢,这是一个有用的说明。我已经相应地更新了我的答案。【参考方案5】:
这个问题已经有一段时间了,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;
【讨论】:
您省略了最重要的部分,即现在可以使 C# 可以为空。【参考方案6】:不可能使引用类型为 Nullable。在 Nullable 结构中只能使用值类型。将问号附加到值类型名称使其可以为空。这两行是一样的:
int? a = null;
Nullable<int> a = null;
【讨论】:
不可能将引用类型设为 Nullable 所有引用类型都可以隐式地为 null。这充其量是误导【参考方案7】:正如其他人所指出的,字符串在 C# 中始终可以为空。我怀疑您在问这个问题是因为您不能将中间名留空或留空? 我怀疑问题出在您的验证属性上,很可能是正则表达式。我无法在脑海中完全解析 RegEx,但我认为您的 RegEx 坚持第一个字符存在。我可能是错的——RegEx 很难。无论如何,请尝试注释掉您的验证属性并查看它是否有效,然后一次将它们添加回来。
【讨论】:
【参考方案8】:string
类型是引用类型,因此默认可以为空。您只能将 Nullable<T>
与值类型一起使用。
public struct Nullable<T> where T : struct
这意味着泛型参数无论替换什么类型,它都必须是值类型。
【讨论】:
我认为您的意思是值类型类型而不是结构?【参考方案9】:string 默认为 Nullable ,你不需要做任何事情来使 string 为 Nullable
【讨论】:
【参考方案10】:您无需执行任何操作,Model Binding
将毫无问题地将null
传递给属性。
【讨论】:
以上是关于如何使我的字符串属性可以为空?的主要内容,如果未能解决你的问题,请参考以下文章
如果STRING_AGG不为空或NULL,则将CONCAT / CONCAT_WS与STRING_AGG一起使用字符串来结果?
如何使我的构造函数和函数工作,以便我的main()能够显示字符串和int数据?
SpEL @ConditionalOnProperty 字符串属性为空或 null