Как назвать одну и ту же переменную, но другого типа - PullRequest
1 голос
/ 05 октября 2011

Я часто сталкиваюсь с ситуациями, когда мне нужно использовать одну и ту же переменную, но преобразованную в другой тип.

, например:

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

Здесь, в ValidatePort мне нужно использоватьта же самая переменная port, но ее тип должен быть целым числом.Для этого мне нужно сначала преобразовать port в int и использовать временную переменную, например iPort или что-то подобное, чтобы затем передать ее в ValidatePort

Это не единственный случайколлизии именования, и в любой другой ситуации я использовал разные подходы (если мне нужна была строка, я назвал ее variableName + String или некоторые другие окончания)

Существует ли в C # соглашение об именовании для этого или общий подход к именованиюпеременные, которые похожи, но разных типов?

Ответы [ 5 ]

2 голосов
/ 05 октября 2011

Я действительно не вижу проблемы - почему вы не можете просто назвать это так:

ValidatePort(int.Parse(port));

?

Тем не менее, мне не нравится такой код -он по существу использует «строковую типизацию» , и это плохо.Тот факт, что вам нужно прибегнуть к префиксам типов для устранения неоднозначности ваших имен, является явным признаком того, что вы делаете что-то не так.

И это: ваша переменная Port никогда не должна иметь тип String вПервое место, если это действительно число.Используйте правильный тип как можно скорее.

Например, если вы получаете номер порта от пользователя через TextBox, никогда не сохраняйте содержимое в виде строки, используйте правильный тип rightпрочь:

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

(Обратите внимание на обработку ошибок, которая необходима для всего пользовательского ввода.)

2 голосов
/ 05 октября 2011

Я бы сказал, что было бы разумно пояснить, что это за переменная,

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 голосов
/ 05 октября 2011

Текущая версия C # не поддерживает это (также я не думаю, что будущий выпуск также поддержит это).Вы можете определить свои собственные стандарты в своем проекте, чтобы избежать этого конфликта имен.Просто дикая догадка - если вам нужно одно и то же имя, но разные типы, значит ли это, что значения источников, приходящих для обоих, различны?Например, при чтении из текстового поля значение может быть строкой, и вы используете string port, но для фактической операции требуется, чтобы оно было integer (int port).Если это так, то вы можете использовать какой-то префикс, указывающий, к чему относится это значение.

0 голосов
/ 05 октября 2011

Вы можете использовать префикс для полей вашего класса:

string _port;
object _anyObject;
bool _anyBool;
public bool AnyBool {get{return _anyBool;}}
void Validate(int port)
{
    /..
}
0 голосов
/ 05 октября 2011

Есть много обозначений, которые вы можете использовать:

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

Это вопрос предпочтений.Лучшая практика - иметь описательные переменные и иметь дело со столкновениями любым способом, который кажется наилучшим для конкретной ситуации.Просто не меняйте стили повсюду, так что в конечном итоге начинайте путать.

...