Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用辅助铸造函数时的约定_C#_Design Patterns_Casting - Fatal编程技术网

C# 使用辅助铸造函数时的约定

C# 使用辅助铸造函数时的约定,c#,design-patterns,casting,C#,Design Patterns,Casting,我最近开始使用函数来简化手指的施法,比如我有一个这样的例子 ((Dictionary<string,string>)value).Add(foo); 这是否违反了编码标准 还有,更简单的例子呢?例如,在我的脚本引擎中,我考虑过这样做 ((StringVariable)arg).Value="foo"; 是 我真的不喜欢为了转换一个值并立即从中获得一个属性,必须用双括号括起来。我有一种感觉,最后一个比第一个差得多,尽管我不这么认为。你也做了一些很好的事情,因为它更容易阅读和了解发生

我最近开始使用函数来简化手指的施法,比如我有一个这样的例子

((Dictionary<string,string>)value).Add(foo);
这是否违反了编码标准

还有,更简单的例子呢?例如,在我的脚本引擎中,我考虑过这样做

((StringVariable)arg).Value="foo";


我真的不喜欢为了转换一个值并立即从中获得一个属性,必须用双括号括起来。我有一种感觉,最后一个比第一个差得多,尽管我不这么认为。你也做了一些很好的事情,因为它更容易阅读和了解发生了什么。Glib(在C中)为它们的类提供了铸造宏,所以这不是一个新概念。不要试图过分节俭来拯救你的手指。

< P>一般来说,我认为这是代码气味。在大多数需要您描述的类型转换的情况下,除了泛型/模板之外,您还可以通过正确使用接口(Java)或虚拟继承(C++)获得相同的行为。将管理类型的责任留给编译器比自己管理要安全得多


如果没有额外的上下文,很难说出您所包含的示例。当然,在某些情况下,您描述的铸造类型是不可避免的;但它们是例外,而不是规则。例如,您正在描述的强制转换类型(以及相关的辅助函数/宏)在通用C库中非常常见。

暂时忽略您可能确实需要执行此强制转换(我个人对此表示怀疑),如果您真的只想“保存您的手指”,您可以使用
using
语句来缩短泛型类型的名称

在文件顶部,使用所有其他用法:

using ShorterType = Dictionary<string, Dictionary<int, List<Dictionary<OtherType, ThisIsRidiculous>>>>;
使用ShorterType=字典;

*嗅嗅嗅嗅*闻起来像肉桂,有丁香的味道。相当宜人的花束这并不是那么糟糕,但是您可能希望在方法中包含
Add
ing:
AddToDictionary(value,foo)(如果您只是这样使用它的话)。这是一种代码气味,泛型表面上应该修复它。我很想知道为什么您不知道,在围绕这个的代码中,有一个字符串->字符串映射分配给'value'变量?如果答案是“因为某个我无法控制/影响的家伙编写了一个返回不明确类型的模块函数。”在这种情况下,我会做两件事。1) 继续研究“someguy”和他的代码,2)我在分配时间消除数据类型的歧义。在我的方法或获取值的代码块的顶部,我声明了一个字典并给它赋值。@Jason这是不可避免的。这只是一个例子。请参见我的第二个示例(这是真实的)。第二件事也许应该完成,但情况并非总是如此,因为这个函数传入一个BaseVariable,有时需要将它转换为一个IntegerVariable或StringVariable。这就是脚本引擎目前的工作方式。事实上,看着这个问题,我意识到目前的工作方式真的是一团糟。我将致力于重构这些变量类,使其基本上不存在问题。事实上,你甚至在问这些问题,这表明你的头脑是正确的。。。对这类事情提出质疑是件好事,在这种情况下,这似乎很好。我可能会对非常类似的事情使用扩展方法。我唯一的犹豫是性能/GC影响,这在本例中似乎不是问题。我以前确实有过3级深嵌套泛型。这太神奇了,我不知道
使用
可以实现这一点!这是一个可靠的解决方案,虽然不像OP所希望的那样是语言不可知论。如果你想要语言不可知论,你可以在这里研究使用名义类型。在这里,您可以创建一个新类,该类完全重用基类的实现,但只在语义上有所不同。如果我到处传递这样一个复杂的地图,它可能是我的数据模型不可分割的一部分。如果我不给它起个名字,谁该受责备?我给你一个提示:最初提出泛型方法的不是那个人。
ToStringVar(arg).Value="foo";
using ShorterType = Dictionary<string, Dictionary<int, List<Dictionary<OtherType, ThisIsRidiculous>>>>;