Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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接口名称前面加上“;I”;_C#_Naming Conventions_Interface - Fatal编程技术网

C# 为什么在C接口名称前面加上“;I”;

C# 为什么在C接口名称前面加上“;I”;,c#,naming-conventions,interface,C#,Naming Conventions,Interface,这种命名惯例背后的基本原理是什么 我看不出有什么好处。额外的前缀只会污染API 我的想法与康拉德的想法是一致的;我在这里要求的主要是所选择的接口。这使得它很容易被识别为接口。要么这样,要么在接口的实现中添加“Impl”(argh)。我对“I”没有问题,它是接口最简单、最直接的命名方式。最有可能使它在intellisense中易于识别,因为所有接口都会聚集在一起。类似于我用btn、tb、lb作为我所有UI控件的前缀。当intellisense启动时,所有控件都聚集在一个简单的组中。我也喜欢它,因为

这种命名惯例背后的基本原理是什么

我看不出有什么好处。额外的前缀只会污染API


我的想法与康拉德的想法是一致的;我在这里要求的主要是所选择的接口。

这使得它很容易被识别为接口。

要么这样,要么在接口的实现中添加“Impl”(argh)。我对“I”没有问题,它是接口最简单、最直接的命名方式。

最有可能使它在intellisense中易于识别,因为所有接口都会聚集在一起。类似于我用btn、tb、lb作为我所有UI控件的前缀。当intellisense启动时,所有控件都聚集在一个简单的组中。

我也喜欢它,因为我可以将其理解为“Iverb behavior”,如“ICanSave”或“IdoubleEntry”等

命名约定的好处是在使用对象之前告诉您有关对象的信息。命名约定已经被广泛使用了很多年,这可以追溯到fortran坚持将整数值限制(如果我没记错的话)为变量名,如“I”和“j”

namespace DataService
interface DataService
class DataService: DataService
匈牙利符号将命名约定提升到了一个全新的丑陋水平,它描述了变量类型,不管它是否是指针等。我们中的许多人接触了大量匈牙利符号的代码后,会出现神经抽搐和口吃


用I作为接口名称的前缀是识别该对象的一种相对低影响、无害的方法。

恰恰相反,命名约定明确地识别了接口

namespace DataService
interface DataService
class DataService: DataService
例如,如果您有:

public class Dog : IPet, IMammal
{
    ....
仅通过阅读,我就可以安全地假设IPet和IMammal可能是接口

NET CLR允许单类继承。所以,如果我有一个基类,我只能从它继承一个类。让我们将IPet接口更改为基类..我们的示例现在变成

public class Dog : Pet, IMammal
{
    ....
我从Pet类继承并实现IMammal接口

namespace DataService
interface DataService
class DataService: DataService
如果我们按照你的建议做了,并删除了字母“I”,我们有:

public class Dog : Pet, Mammal
{
    ....
我从哪个类继承?我正在实现的接口是什么?这会让人困惑,对吗?(仅供参考..您应该始终将基类放在第一位,因此您可以论证这一点…但是如果您主张从接口名称前缀中删除字母I,我怀疑您是否也遵循该做法)


正如您所看到的,命名约定可以轻松地告诉我很多关于对象的信息,而无需我进一步调查。我可以很容易地看出我继承了什么和实现了什么。

事实上,我发现避免命名冲突很有用,例如,我可以创建一个名为Fred的具体类来实现IFred

我认为界面命名约定很愚蠢。这是匈牙利记谱法的一个例子,我赞同鄙视匈牙利记谱法的思想流派。如果您只有一个具有相同名称的实现的接口,那么考虑这是代码气味的可能性。
但是,我仍然使用它,因为在这种情况下,IInterface是微软推荐的,而且“标准比更好”

我一直认为在行为界面中使用动词很有趣。这与使用名词的类命名约定不同,但它允许类对其行为“说话”

class Dog: IBark
这对于像WCF接口这样的结构接口来说并不好用,但是我们不需要一直玩得很开心

要回答您的问题,请将
I
视为“实现”,以便

此服务类继承自
Dog
并实现
IDataService

我还没有真正回答您的问题,但是
I
很有用,因为名称空间、类和接口之间存在命名冲突

namespace DataService
interface DataService
class DataService: DataService
因此,我们以

namespace DataServices
interface IDataService
class DataService : IDataService

我觉得实际上,,这是一个理智的约定。

这只是一个命名约定,这样每个人都会知道它是一个接口还是其他什么它不是强制性的,编译器也不是IDE,但我一生中看到的所有接口都是从字母i开始的。首先,我相信前缀i然后描述是错误的,因为它意味着实现可以有一个较短的名称。IList(intf)->列表。这是一种反模式,因为我们都知道我们应该使用intf,并且在创建时可能只使用具体类型。不要激怒我,这是一个概括,但前提是intf only impl NORY。实现名称应该描述它如何实现intf或它在做什么。想想intf List,LinkedList,它使用链表实现列表。谁在乎它是否更长,因为我们大部分时间都应该使用列表。如果我们有一个实现了许多intf的类,那么我们可能不应该将所有intf都包括在内,因为这是类的真正用途。在这种情况下,不使用intf删除某些内容是有意义的。ppl直呼我的名字,而不是人、兄弟姐妹、开发者等,用我的名字是最好的最具描述性的名字。我想,如果一个类是impl,一个简单的intf,那么就称它为Default intf,这使它成为ious上的intf,这是intf的默认实现。 类的名称最终应该是人类可读的,并且几乎是描述其用途的一个简短短语。前缀代码等都不是很好,因为我们用的是单词而不是代码。计算机不关心类的名称,所以为什么仍然是我们命名的东西,所以名称帮助我们和我们的同事

我的约定似乎是一个古老的约定,在今天已经不相关了。当前的代码编辑器提供了许多有关您正在使用的类型的细节,因此认为识别接口更容易,就像要求名称空间以“N”作为前缀一样,因为您希望确保不会将其与具体类混淆(前缀为“C”)

公约并不意味着它是一个好的公约。有时候,这是绝对的
public class XmlConfigurationFile : ConfigurationFile, IDisposable
{
}

public class YamlConfigurationFile : ConfigurationFile, IDisposable
{
}
public class XmlConfigurationFile : IDisposable, ConfigurationFile
{
}
public class MyConfigurationFile : XmlConfigurationFile, YamlConfigurationFile
{
}
public class Dog : Pet, Mammal
{
}
public class Dog : Mammal, Pet
{
}