如何使字符串属性为空?

我想使人的中间名(CMName)可选。我一直在使用 C # .net 代码优先的方法。对于整数数据类型,只需使用 ?运算符即可使其为空。我正在寻找一种方法,使我的刺变量为零。我试图搜索,但找不到办法使其无效。

下面是我的代码。请建议我如何使它为空。

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; }
}
206345 次浏览

Strings are nullable in C# anyway because they are reference types. You can just use public string CMName { get; set; } and you'll be able to set it to null.

string type is a reference type, therefore it is nullable by default. You can only use Nullable<T> with value types.

public struct Nullable<T> where T : struct

Which means that whatever type is replaced for the generic parameter, it must be a value type.

String is a reference type and always nullable, you don't need to do anything special. Specifying that a type is nullable is necessary only for value types.

It's not possible to make reference types Nullable. Only value types can be used in a Nullable structure. Appending a question mark to a value type name makes it nullable. These two lines are the same:

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

As others have pointed out, string is always nullable in C#. I suspect you are asking the question because you are not able to leave the middle name as null or blank? I suspect the problem is with your validation attributes, most likely the RegEx. I'm not able to fully parse RegEx in my head but I think your RegEx insists on the first character being present. I could be wrong - RegEx is hard. In any case, try commenting out your validation attributes and see if it works, then add them back in one at a time.

You don't need to do anything, the Model Binding will pass null to property without any problem.

System.String is a reference type so you don't need to do anything like

Nullable<string>

It already has a null value (the null reference):

string x = null; // No problems here

C# 8.0 is published now, so you can make reference types nullable too. For this you have to add

#nullable enable

Feature over your namespace. It is detailed here

For example something like this will work:

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

If you want to globally set nullable property for whole project; you can do it in .csproj file by adding

<Nullable>enable</Nullable>

property to PropertyGroup. It will enable nullablity for all classes in the project.

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>


<!-- Other Settings -->
</Project>

Also you can have a look this nice article from John Skeet that explains details.

string is by default Nullable ,you don't need to do anything to make string Nullable

It's been a while when the question has been asked and C# changed not much but became a bit better. Take a look Nullable reference types (C# reference)

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

C# as a language a "bit" outdated from modern languages and became misleading.

for instance in typescript, swift there's a "?" to clearly say it's a nullable type, be careful. It's pretty clear and it's awesome. C# doesn't/didn't have this ability, as a result, a simple contract IPerson very misleading. As per C# FirstName and LastName could be null but is it true? is per business logic FirstName/LastName really could be null? the answer is we don't know because C# doesn't have the ability to say it directly.

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

As far as I can see this is just a warning. You can still set strings to null and the code will still compile and run.

To disable these warnings for your whole project you can set the Nullable flag to disabled in your .csproj file as shown below:

<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<Nullable>disable</Nullable>
</PropertyGroup>