gpt4 book ai didi

activerecord - SubSonic 3 ActiveRecord 生成的代码带有警告

转载 作者:行者123 更新时间:2023-12-02 00:44:58 27 4
gpt4 key购买 nike

当使用带有 ActiveRecord T4 模板的 SubSonic 3 时,生成的代码会显示许多关于 CLS 合规性、未使用的项目和缺少 GetHashCode() 实现的警告。

为了避免它们,我做了以下修改:

// Structs.tt
[CLSCompliant(false)] // added
public class <#=tbl.CleanName#>Table: DatabaseTable
{ ...

// ActiveRecord.tt
[CLSCompliant(false)] // added
public partial class <#=tbl.ClassName#>: IActiveRecord
{
#region Built-in testing
#pragma warning disable 0169 // added
static IList<<#=tbl.ClassName#>> TestItems;
#pragma warning restore 0169 // added
...

public override Int32 GetHashCode() // added
{
return this.KeyValue().GetHashCode();
}

...

是否有更好的方法来消除警告?或者更好的 GetHashCode() 实现?

最佳答案

目前,消除警告的唯一方法是更新您的 t4 模板并向 Rob 提交错误/修复。或者等到别人做。

至于 GetHashCode 实现,我认为您不会找到通过模板执行此操作的好方法。哈希码生成非常依赖于对象包含的状态。名字后面有很多字母的人经过长时间的艰苦努力,才想出快速且返回结果冲突几率低的哈希码算法。从一个模板中执行此操作可能会生成一个类,该类可能包含数百万种不同的状态排列,这是一项艰巨的任务。

Rob 可能做的最好的事情就是提供一个调用分部方法的默认实现,检查结果并在找到时返回它。这是一个例子:

public partial class Foo
{
public override int GetHashCode()
{
int? result = null;
TryGetHashCode(ref result);
if (result.HasValue)
return result.Value;
return new Random().Next();
}

partial void TryGetHashCode(ref int? result);
}

public partial class Foo
{
partial void TryGetHashCode(ref int? result)
{
result = 5;
}
}

如果你在没有实现 TryGetHashCode 的情况下编译它,编译器将完全忽略对 TryGetHashCode 的调用,你从 result 的声明转到检查它是否有值(value),它永远不会,因此返回哈希码的默认实现。

关于activerecord - SubSonic 3 ActiveRecord 生成的代码带有警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1087496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com