Присвоение строки классу перенаправляет ее в свойство - PullRequest
0 голосов
/ 10 июля 2009

У меня есть класс с именем Car и свойством Name. Теперь каждый раз, когда мне нравится менять имя моего автомобиля, я должен написать Car1.Name = "Porka Turbo". Теперь я хотел бы написать на 5 символов меньше:

Car1 = "Porka Turbo"

Это должно работать следующим образом: если я назначаю класс, полученный из класса Car, он должен выполнять регулярное присвоение класса, но когда я присваиваю строку своему классу, эта строка должна перенаправляться в свойство с именем "Name".

Так что он будет работать так же, как:

Car1.Name = "Porka Turbo"

Возможно ли это в C # .NET 3.5, и если нет, то знаете ли вы какой-либо другой способ писать меньше в этом конкретном примере?

Ответы [ 5 ]

5 голосов
/ 10 июля 2009

Предполагая, что Car1 является переменной типа Car, вы не можете этого сделать. Да и не надо - это кошмар читабельности.

Присвоение переменной должно означать изменение значения переменной на (возможно, преобразованное) значение в RHS оператора присваивания. Вы пытаетесь изменить значение оператора.

Если вас беспокоит количество символов в , гораздо более удобочитаемом :

Car1.Name = "Porka Turbo";

вы могли бы создать однобуквенный метод:

Car1.X("Porka Turbo");

Или другое свойство:

Car1.N = "Porka Turbo";

Я бы не стал ни того, ни другого. Держите код простым и читабельным. Кто бы ни должен был поддерживать код в будущем (а может быть и вы), не поблагодарит вас, если вы приоритизируете «минимальное количество символов в источнике» над читабельностью.

РЕДАКТИРОВАТЬ: один вариант, который еще не был представлен, обеспечивает неявное преобразование из строки в автомобиль. Что позволит вам написать

Car1 = "Porka Turbo";

но не будет изменять имя свойства существующего автомобиля - это будет создание нового автомобиля и присвоение этого значения Car1. Я упоминаю об этом только в том случае, если кто-то еще добавит это в качестве опции, не упомянув о проблеме с ней:)

2 голосов
/ 10 июля 2009

Я не знаю, есть ли способ выполнить то, что вы ищете (возможно, есть), но я бы посоветовал не делать этого, поскольку я нахожу это запутанным. Начнем с того, что экземпляр Car1 в вашем примере будет действовать так, как если бы он был строкой (а это не так), и будет менее понятно, что на самом деле делает код.

1 голос
/ 10 июля 2009

Я думаю, что корень этого запроса, во-первых, заключается в глубоком недопонимании ООП. Хорошая вещь с объектно-ориентированным языком, таким как C #, состоит в том, что объект типа Car всегда будет Car, и ничем иным. Строка всегда будет строкой, а строка никогда не будет автомобилем. Заключение фрагмента текста в двойные кавычки является сокращением для создания нового экземпляра строки. Для создания нового экземпляра Car такой краткости нет. Вы никогда не можете сказать, что «Эта строка на самом деле является автомобилем», например, по той причине, что строка не имеет свойства «Имя».

Лучшее, что я могу сказать, это продолжать работать с C #, и вскоре вы поймете, что это так =)

1 голос
/ 10 июля 2009

Нет, C # не позволяет перегрузить оператор присваивания.

1 голос
/ 10 июля 2009

Это невозможно, поскольку оператор присваивания не может быть перегружен.

Даже если бы это было возможно, я не должен этого делать. Что вы получаете с этим?
Несколько символов, которые вы должны ввести? Не забывайте, что код читается гораздо чаще, чем пишется.
Когда вы перечитываете / просматриваете этот код через год или два, я думаю, что вы несколько раз почесаете затылок ...

Кроме того, предположим, что можно было бы перегрузить оператор присваивания:

Что вы будете делать, если хотите назначить другой экземпляр Car Car1?

Что вы будете делать, если Car1 равен NULL?

...