Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 06:11
Оценка:
Привет!

Я правильно понимаю, что в C# нельзя описать структуру внутри функции, чтобы она только в ней и была видна

class A
{
void f()
{
struct MyStruct{
int m,n;
};
}
};

Компилятор такое не пропускает. В C++ такое допустимо.

Если да — как лучше скалькировать это с С++ на С# ? Вариант выноса стуктуры на уровень класса не годится — в функции g на С++ может быть описана другая стуктура с тем же именем.

26.09.05 21:49: Перенесено модератором из '.NET' — TK
With best regards
Pavel Dvorkin
Re: Структура внутри функции
От: Andrbig  
Дата: 21.09.05 06:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я правильно понимаю, что в C# нельзя описать структуру внутри функции, чтобы она только в ней и была видна


Да. (И слава богу)

PD>Если да — как лучше скалькировать это с С++ на С# ? Вариант выноса стуктуры на уровень класса не годится — в функции g на С++ может быть описана другая стуктура с тем же именем.


Ну и что? Заведи класс _serviced или еще какой и туда засунь эту структуру.
Re[2]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 06:52
Оценка:
Здравствуйте, Andrbig, Вы писали:


A>Ну и что? Заведи класс _serviced или еще какой и туда засунь эту структуру.


Не понял. Что изменится в плане видимости, если я структуру засуну в класс ?
Кто помешает создавать экземпляры этого класса где бы то ни было ? А я хочу только в данной функции

Вот пример на C++

class MyClass
{
void f(void)
{
struct A {
int x,y;
};
// any code can use this type A (2 int fields)
}
void g(void)
{
struct A {
float a,b,c;
};
// any code can use this type A (3 float fields)
}
void h()
{
// no A declaration so type A can't be used
}
};

// no A declaration so type A can't be used

1.В функции f есть тип A — struct из 2 int. За пределами функции f он не существует.
2.В функции g есть тип A — struct из 3 float. За пределами функции g он не существует.
3.За пределами f и g никакого типа А вообще не имеется. Нельзя использовать тип A ни в других функциях класса MyClass, ни за пределами класса MyClass

Если не сложно, перепиши на C#, соблюдая требования 1-3.
With best regards
Pavel Dvorkin
Re[3]: Структура внутри функции
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.05 06:59
Оценка: 1 (1) -3
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Кто помешает создавать экземпляры этого класса где бы то ни было ? А я хочу только в данной функции

Таких параноидальных типов видимости в .NET не бывает.
Re[4]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 07:10
Оценка: +1
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Кто помешает создавать экземпляры этого класса где бы то ни было ? А я хочу только в данной функции

Mab>Таких параноидальных типов видимости в .NET не бывает.

Я бы все же просил придерживаться политкорректности. Такие типы видимости существуют в Паскале, С/C++, из чего не следует, что эти языки являются параноидальными.
With best regards
Pavel Dvorkin
Re[5]: Структура внутри функции
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.05 07:17
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я бы все же просил придерживаться политкорректности. Такие типы видимости существуют в Паскале, С/C++, из чего не следует, что эти языки являются параноидальными.

О, ну прошу прощения, забыл добавить ИМХО. Так вот ИМХО это и есть чистой воды паранойя. Ибо такая возможность решает несуществующую проблему. Объявление типа в виде приватного члена объемлющего класса ничем не хуже.
Re[6]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 07:32
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Я бы все же просил придерживаться политкорректности. Такие типы видимости существуют в Паскале, С/C++, из чего не следует, что эти языки являются параноидальными.

Mab>О, ну прошу прощения, забыл добавить ИМХО. Так вот ИМХО это и есть чистой воды паранойя.

Вытащил с одного сайта определение паранойи.

Паранойя, психическое нарушение, характеризующееся подозрительностью и хорошо обоснованной системой сверхценных идей, приобретающих при чрезмерной выраженности характер бреда

Не совсем понятно, при чем здесь подозрительность, а тем более сверхценные идеи


>Ибо такая возможность решает несуществующую проблему. Объявление типа в виде приватного члена объемлющего класса ничем не хуже.


А вот это опросил бы подробнее прокомментировать. Насколько я понимаю, такое объявление позволит мне создавать экземпляры этого объекта где бы то ни было внутри класса, так ?

Предположим, что класс огромный по размеру кода (я сказал "предположим", это не надо сейчас обсуждать с точки зрения хорошего стиля программирования), а поэтому его разработка поручена нескольким человекам. Им по ходу работы нужно создавать структуры (пусть даже не классы!), чтобы просто не иметь сотен переменных. Значит, им придется согласовывать друг с другом имена этих структур, так ? Ведь описания этих структур надо выносить на уровень класса ?
Или я что-то не так понял ?
With best regards
Pavel Dvorkin
Re[5]: Структура внутри функции
От: Аноним  
Дата: 21.09.05 07:30
Оценка:
Объявление типа в виде приватного члена объемлющего класса ничем не хуже.
--------------
Только если таких типов штук 10 и каждый из них используется только в отдельно взятой функции, уже не будет казаться таким параноидальным.
-----
Нулевое оформления постов благодаря Opere.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Структура внутри функции
От: Аноним  
Дата: 21.09.05 07:36
Оценка: -1
2 Автор
Используй C#3 Там есть неименованные структуры

А если серьёзно:


Если да — как лучше скалькировать это с С++ на С# ? Вариант выноса стуктуры на уровень класса не годится — в функции g на С++ может быть описана другая стуктура с тем же именем.

Возвращай Hashtable, если возможно


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[7]: Структура внутри функции
От: MatFiz Россия  
Дата: 21.09.05 07:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А вот это опросил бы подробнее прокомментировать. Насколько я понимаю, такое объявление позволит мне создавать экземпляры этого объекта где бы то ни было внутри класса, так ?


PD>Предположим, что класс огромный по размеру кода (я сказал "предположим", это не надо сейчас обсуждать с точки зрения хорошего стиля программирования), а поэтому его разработка поручена нескольким человекам. Им по ходу работы нужно создавать структуры (пусть даже не классы!), чтобы просто не иметь сотен переменных. Значит, им придется согласовывать друг с другом имена этих структур, так ? Ведь описания этих структур надо выносить на уровень класса ?

PD>Или я что-то не так понял ?

Не забывай про метаданные.
В каком неймспейсе, например, будет находиться эта структура?
Конечно, я согласен, что афторы C# зря убрали возможность создавать временные структуры в теле функции, но ничего не поделать.
С другой стороны, это не дает тебе писать в плохом стиле, когда тело функции занимает несколько экранов и в связи с этим нефтыкаемо методом окидывания взглядом.
Так что это ограничение на самом деле тебе самому и на пользу.
How are YOU doin'?
Re[7]: Структура внутри функции
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.05 07:43
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А вот это опросил бы подробнее прокомментировать. Насколько я понимаю, такое объявление позволит мне создавать экземпляры этого объекта где бы то ни было внутри класса, так ?


PD>Предположим, что класс огромный по размеру кода (я сказал "предположим", это не надо сейчас обсуждать с точки зрения хорошего стиля программирования), а поэтому его разработка поручена нескольким человекам. Им по ходу работы нужно создавать структуры (пусть даже не классы!), чтобы просто не иметь сотен переменных. Значит, им придется согласовывать друг с другом имена этих структур, так ? Ведь описания этих структур надо выносить на уровень класса ?

PD>Или я что-то не так понял ?
Тут вопрос философский. .NET как платформа для разработки заодно подразумевает некоторый стиль написания кода под нее. Свойство это выражено намного сильнее, чем, скажем, в C++, где одно и то же можно описать десятью различными способами, а потом еще удивляться, отчего сосед делает это 11-м. Платформа подразумевает этот стиль временами весьма навязчиво, так что написание кода не следуя ему становится довольно затруднительным.

Поэтому не стоит удивляться, отчего платформа не дает и дальше писать код в старом стиле, делая этот "огромный" класс еще более огромным. Рефакторинг поможет решить эту проблему, благо в C# инструменты для него имеются (в отличие от C++ и Pascal).
Re[8]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 08:00
Оценка:
Здравствуйте, MatFiz, Вы писали:

MF>С другой стороны, это не дает тебе писать в плохом стиле, когда тело функции занимает несколько экранов и в связи с этим нефтыкаемо методом окидывания взглядом.


Не хочу я писать в плохом стиле. Я наоборот хочу в хорошем писать

Ситуация. Пишу я функцию. В ней штук 10 переменных, описывающих некоторый внутренний для этой функции объект (слово объект в общечеловеческом смысле, а не в смысле языка). В соответствии с правилами хорошего стиля стоит из них создать структуру, чтобы обращаться к этим переменным как к некоторому единому целому. Ну хоть скопировать их все в другой набор таких же переменных (для другого объекта).

Все это интересно в данной функции. За пределами этой функции такая структура никому не нужна, да и вообще желательно, чтобы о ней никто не знал, потому как дело это сугубо внутреннее для этой функции. А получается, что сделать такое невозможно.

MF>Так что это ограничение на самом деле тебе самому и на пользу.


Не похоже...
With best regards
Pavel Dvorkin
Re[8]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 08:05
Оценка:
Здравствуйте, Mab, Вы писали:


Mab>Тут вопрос философский. .NET как платформа для разработки заодно подразумевает некоторый стиль написания кода под нее. Свойство это выражено намного сильнее, чем, скажем, в C++, где одно и то же можно описать десятью различными способами, а потом еще удивляться, отчего сосед делает это 11-м. Платформа подразумевает этот стиль временами весьма навязчиво, так что написание кода не следуя ему становится довольно затруднительным.


А кстати, если можно, еще один вопрос. Не в курсе, как в managed C++ с этим дело обстоит ? В С++ это разрешается! Или в managed запретили, или все же дело не в .Net, а только в C# ?

Mab>Поэтому не стоит удивляться, отчего платформа не дает и дальше писать код в старом стиле, делая этот "огромный" класс еще более огромным. Рефакторинг поможет решить эту проблему, благо в C# инструменты для него имеются (в отличие от C++ и Pascal).


Ладно, насчет "огромного" класса возражение приму. Но остается другое возражение, я его привел в ответе MatFiz (http://www.rsdn.ru/Forum/Message.aspx?mid=1393827&only=1
Автор: Pavel Dvorkin
Дата: 21.09.05
)
With best regards
Pavel Dvorkin
Re[9]: Структура внутри функции
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.05 08:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А кстати, если можно, еще один вопрос. Не в курсе, как в managed C++ с этим дело обстоит ? В С++ это разрешается! Или в managed запретили, или все же дело не в .Net, а только в C# ?

Нет не запретили. Это эмулируется через объявление в сборке в отдельном неймспейсе структуры с compile-generated именем.

PD>Ладно, насчет "огромного" класса возражение приму. Но остается другое возражение, я его привел в ответе MatFiz (http://www.rsdn.ru/Forum/Message.aspx?mid=1393827&only=1
Автор: Pavel Dvorkin
Дата: 21.09.05
)

Сложно посоветовать в общем случае. Периодически на работе приходится сталкиваться с тем, что алгоритм работы отдельных функций и количество требуемых им описаний типов начинает превышать допустимые лимиты (мы, в частности, пишем код для обсчета транспортных графов, где проблемы в первую очередь алгоритмические). В такой ситуации подходящим решением оказывается выделение каждого из этих алгоритмов в отдельный класс. Вообще принцип простой: как только становится ясно, что дальнейшее наращивание размера класса приводит к трудностям при сопровождении, -- значит нужно делать рефакторинг и резать класс на более мелкие.
Re[8]: Структура внутри функции
От: Аноним  
Дата: 21.09.05 08:32
Оценка:
Ну не пойму чем тебе Hastable не нравится?

class Class1
{
public Hashtable FuncA()
{
Hashtable result = new Hashtable();
result.Add( "m", 10 );
result.Add( "n", 5 );
return result;
}
public Hashtable Func2()
{
Hashtable result = new Hashtable();
result.Add( "Cost", (double)10 );
result.Add( "MySpecificData", new MySpecificObject() );
return result;
}
}




данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[10]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 08:32
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Сложно посоветовать в общем случае. Периодически на работе приходится сталкиваться с тем, что алгоритм работы отдельных функций и количество требуемых им описаний типов начинает превышать допустимые лимиты (мы, в частности, пишем код для обсчета транспортных графов, где проблемы в первую очередь алгоритмические). В такой ситуации подходящим решением оказывается выделение каждого из этих алгоритмов в отдельный класс. Вообще принцип простой: как только становится ясно, что дальнейшее наращивание размера класса приводит к трудностям при сопровождении, -- значит нужно делать рефакторинг и резать класс на более мелкие.


Это ответ на несколько не тот вопрос, который я там задал

Но в общем все понятно. Нет их, и все тут, а дальше можно философствовать на тему, хорошо это или плохо, до бесконечности.

Спасибо за обсуждение.
With best regards
Pavel Dvorkin
Re[10]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 08:42
Оценка:
Здравствуйте, Mab, Вы писали:

Кстати, к enum это тоже относится ? Нельзя описать enum в функции ?
With best regards
Pavel Dvorkin
Re[11]: Структура внутри функции
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.09.05 08:45
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

Это относится ко всем типам. Они могут быть описаны лишь внутри структур, классов или пространств имен.
Re[9]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 08:45
Оценка:
Здравствуйте, k_savelev, Вы писали:

_>Ну не пойму чем тебе Hastable не нравится?


_> class Class1

_> {
_> public Hashtable FuncA()
_> {
_> Hashtable result = new Hashtable();
_> result.Add( "m", 10 );


Хорошенькое дело! В структуре список полей жестко определен, несуществующее поле употребить просто невозможно. А здесь пиши, что хочешь! И потом стуктура все же в стеке лежит, доступ к ней прямой, а тут поиск в Hashtable.
With best regards
Pavel Dvorkin
Re[12]: Структура внутри функции
От: Pavel Dvorkin Россия  
Дата: 21.09.05 08:47
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, Pavel Dvorkin, Вы писали:


Mab>Это относится ко всем типам. Они могут быть описаны лишь внутри структур, классов или пространств имен.


Вот это уже черт знает, что такое. Получается, что внутри функции и набор констант определить нельзя!
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.