如何将GUID属性设置为null

42

我有一个类型为Employee的对象,其中包含一个Guid属性。我知道如果想将其设置为null,必须将我的类型属性定义为可空的Nullable<Guid> prop或Guid? prop。

但在我的情况下,我无法更改prop的类型,因此它将保持Guid类型,我和我的同事都不想使用Guid.Empty。

是否有办法将我的属性设置为null或string.empty,以便在数据库中将字段恢复为空。

我有一种从string.empty转换为null的机制,但如果将其更改为接受空guid以获取null,则需要更改许多内容。

请帮忙!


1
Guid是一个结构体,它们不能为null。您需要使用可空类型,可以使用Guid?Nullable<Guid>。没有其他方法。 - Jeroen Vannevel
1
当我看到像“我知道我应该这样做,但我做不到”的话时,请停下来。是的,你可以,而且你应该这样做。为什么要通过黑客攻击自己呢? - fejesjoco
9个回答

87
有没有一种方法可以将我的属性设置为null或string.empty,以便将数据库中的字段重新建立为空。不行,因为它是非空的。如果要使其可为空,必须使用Nullable<Guid> - 如果你没有这样做,那么使用Nullable<T>就没有意义。你有一个基本的问题 - 正如你在第一段所说的那样。你说:“我知道如果我想实现A,我必须做B - 但我想实现A而不做B。”这在定义上是不可能的。最接近的办法是使用一个特定的 GUID 来代替空值 - Guid.Empty (也可用于适当的default(Guid),例如可选参数的默认值)是明显的候选,但你已经出于不明确的原因将其拒绝了。

1
而且稍微解释一下,它是非空的,因为它是一个结构体,因此是值类型。值类型不能为 null。Nullable<T> 可以将一个值类型包装在另一个值类型中,该类型可以表示空值。如果你将其设置为 Nullable<Guid>Guid?,则可以将 DB 端表示为 UNIQUEIDENTIFIER NULL - Haney
1
@DavidHaney:不,你误解了Nullable<T> - 它也是值类型,但它有一个表示包装值不存在的值。如果Nullable<T>真的是引用类型,那么它将会不太令人愉快。 - Jon Skeet
因为这样你需要为每个值创建一个实例(在堆上),而不是值被“内联”,这会导致更多的垃圾回收压力。 - Jon Skeet
2
@JonSkeet 我不能使用 Guid.Empty,因为我想将其作为方法参数的默认值。正如编译器指出的那样,“X 的默认参数值必须是编译时常量”! - Kishan Vaishnav
3
你可以使用 default(Guid) 来实现。这与 Guid.Empty 等价。 - Jon Skeet
显示剩余3条评论

37
Guid? myGuidVar = (Guid?)null;

这是可能的。不需要进行不必要的转换。

Guid? myGuidVar = null;

有趣的评论是,如果你有一个可空的Guid,它应该在任何地方都被定义为可空(我指的是甚至作为方法内部的参数)。 - Gonzo345
这段代码在db返回字符串、model需要Nullable GUID的情况下对我很有帮助:UserRoleID = String.IsNullOrEmpty(userrole.RoleId) ? (Guid?)null : new Guid(userrole.RoleId); - Doug
1
当问题明确声明不是一个有效答案时,这个回答怎么会得到18个赞?它是从另一个问题合并过来的吗? - nvoigt

24
自"Guid"不可为空,因此使用"Guid.Empty"作为默认值。

9

选择你的解决方案 - 如果无法将属性类型更改为可为空,则必须使用“魔术”值来表示NULL。 Guid.Empty 看起来不错,除非你有某些特定的原因不想使用它。第二个选择是 Guid.Parse("ffffffff-ffff-ffff-ffff-ffffffffffff") 但我认为那样会很丑陋。


8
您可以使用 typeof(Guid), "00000000-0000-0000-0000-000000000000" 作为属性的 DefaultValue。这是关于IT技术的内容。

3

您可以使用 ? 运算符使 guid 变量接受 null 值,然后使用 Guid.Empty 或将其强制转换为 null 值 (Guid?)null;

例如:

 Guid? id = Guid.Empty;

或者
 Guid? id =  (Guid?)null;

问题明确说明他们不能这样做。 - nvoigt

0
如果您正在使用一个调用存储过程的 .Net SqlCommand,您可以使用下面的代码将参数设置为 NULL。
SqlCommand cmdCust = new SqlCommand("MyProc", myConn);    
cmdCust.Parameters.Add("@CustID", SqlDbType.UniqueIdentifier).Value = DBNull.Value;

0

我认为这是正确的方法:

Guid filed = Guid.Empty;


0

从数据库函数中提取Guid值:

    #region GUID

    public static Guid GGuid(SqlDataReader reader, string field)
    {
        try
        {
            return reader[field] == DBNull.Value ? Guid.Empty : (Guid)reader[field];
        }
        catch { return Guid.Empty; }
    }

    public static Guid GGuid(SqlDataReader reader, int ordinal = 0)
    {
        try
        {
            return reader[ordinal] == DBNull.Value ? Guid.Empty : (Guid)reader[ordinal];
        }
        catch { return Guid.Empty; }
    }

    public static Guid? NGuid(SqlDataReader reader, string field)
    {
        try
        {
            if (reader[field] == DBNull.Value) return (Guid?)null; else return (Guid)reader[field];
        }
        catch { return (Guid?)null; }
    }

    public static Guid? NGuid(SqlDataReader reader, int ordinal = 0)
    {
        try
        {
            if (reader[ordinal] == DBNull.Value) return (Guid?)null; else return (Guid)reader[ordinal];
        }
        catch { return (Guid?)null; }
    }

    #endregion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接