2011-10-05 69 views
1

我经常遇到需要使用相同变量但转换为其他类型的情况。如何命名相同的变量但不同类型

例如:

string port; 
... 
ValidatePort(int port); 

在这里,在ValidatePort我需要使用相同的变量port但它的类型应该是整数。为了做到这一点,我需要先原转换portint和使用像iPort或类似的东西临时变量,然后把它传递给ValidatePort

这不是命名冲突的唯一案例,并在我使用的所有其他情况不同的方法(如果我需要一个字符串,我称之为variableName + String或其他一些结尾)

在C#中是否存在一个命名约定,或者命名约定类似但类型不同的变量?

回答

2

我会说明智的是通过看它来明确变量是什么。

var time; 

你不知道代表什么。它可以是任何一种:

int time; // number of seconds 
DateTime time; 
TimeSpan time; 

我想说

int port = 7; 
string portAsString = port.toString(); 

但你上面的代码中,有只调用它端口作为这个代码是没有问题的完全有效的:

string port = "7"; 

int portAsInteger = int.parse(port); // If you need a temporary variable 

myMethod(int.parse(port)); // You can use variable 'port' twice as scope is different 
myMethod(portAsInteger); 

public void myMethod(int port) { .... } 
+0

谢谢。至于代码 - 它只是许多案例的一个例子。在其中一些转换可能需要多个行 – username

+0

绝对,即使上面的例子你想要一些错误检查,以确保字符串版本的端口是一个有效的数字或int.parse将引发异常。 – NibblyPig

0

有很多符号,你可以使用:

strSomething 
somethingStr 
szSomething // Microsoft uses this in their C stuff 

它喜好的问题。最佳实践是具有描述性变量,并以特定情况下最好的方式处理碰撞。只是不要随处切换样式,所以最终会变得非常混乱。

0

您可以使用前缀类广泛的领域:

string _port; 
object _anyObject; 
bool _anyBool; 
public bool AnyBool {get{return _anyBool;}} 
void Validate(int port) 
{ 
    /.. 
} 
+0

问题不在字段与局部变量名称中,而是在相同变量的名称中转换为不同类型 – username

+0

我明白了你的观点,但我没有看到任何问题。如果一个字符串包含端口号的字符串表示形式,则它也可以被称为端口,因为它包含相同的信息。无论如何,这是一个非常主观的问题。 – PVitt

+0

是的,我甚至想问一下progammers :-)。如果你都是局部变量,你会如何调用变量的字符串表示?或者如果你有一个字符串,你需要以后用int来使用它? – username

2

我实在不明白的问题 - 为什么你就不能这样称呼它:

ValidatePort(int.Parse(port)); 

也就是说,我不喜欢这样的代码 - 它基本上使用“stringly typing”,这是一件坏事。事实上,你需要求助于键入前缀来消除你的名字歧义,这是一个明确的信号,表明你做错了什么。

也就是说:如果Port变量真的是数字,那么该变量首先不应该是String类型的变量。尽可能使用正确的类型。

举例来说,如果你通过一个TextBox获取用户的端口号,永远不要存储内容为一个字符串,使用正确的类型马上:

int port; 
if (! int.TryParse(portInput.Text, out port)) { 
    // Handle wrong user input. 
} 

(注意错误这对于所有的用户输入来说都是必不可少的。)

+0

好吧,我想我做了一个坏例子,但是如果你有一个正确类型的变量然后想用它作为一个字符串或转换为其他类型?无论如何,好点+1 – username

+2

我认为为validateport创建一个重载会更好,以便您可以让验证方法验证端口...为什么要调用ValidatePort,如果您要首先验证它自己?如果验证是由目标对象而不是源完成的,那么它更好(特别是对于TDD)。 – NibblyPig

+0

@SLC这是另一点,尽管它在某种程度上取决于方法的确切目的。例如,一个'ValidateIP'方法可以设想接受一个'IP'对象(即格式已经保证正确)并且验证包括确定IP是否响应ping。对于一个港口来说类似的东西。但在这两种情况下,“验证...”都是一个过于宽泛的名称。 –

0

当前版本的C#不支持这个功能(另外,我不认为未来的版本会支持这个功能)。您可以在项目中定义自己的标准以避免命名冲突。只是一个疯狂的猜测 - 当你想要相同的名称,但不同的类型,是否意味着两者的价值来源是不同的。例如,从文本框读取时,该值可能是一个字符串,并且您使用的是string port,但对于实际操作,它需要它为integerint port)。如果是这种情况,那么你可以使用一些前缀来指示这个值属于哪里。

相关问题