Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2016, 16:07   #11
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я знаю, даже с инициализаторами вопрос решили.
come-on видимо пытался сказать, что { get; set; } мало чем отличается от public Foo field;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 14.09.2016, 16:12   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
come-on видимо пытался сказать, что { get; set; } мало чем отличается от public Foo field;
я думаю все же он имел в виду
Код:
private Foo _field;
public Foo Field{get{return _field;}set{_field=value}}


короткий синтаксис для readonly свойств тоже порадовал.
как-то так.
public Foo Prop=>new Foo();
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.09.2016 в 16:16.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.09.2016, 21:28   #13
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Это всё прекрасно, но, как я сказал, было бы "правильнее" вернуть элемент из массива, а не ссылку на весь массив. Что можно сделать либо методом, либо отдельно создать индексатор с его свойством, и отдельно создать свойство для массива. Перед обращением к свойству для массива задавать нужный индекс через свойство индексатора. Дичь - но будет как раз то, о чём я говорю.
Код:
...
private int[] data;
private indexator;
public int Indexator
{
	set
	{
		indexator=value;
	}
	get
	{
		return indexator;
	}
}
public int DataElem
{
	set
	{
		data[indexator]=value;
	}
	get
	{
		return data[indexator];
	}
}
Так можно делать и чтение, и запись. Так же будет работать следующий код:
Код:
...
private int[] data;
public int GetElem(int index)
{
	return data[index];
}
public void SetElem(int index, int value/*а вот без такого value здесь уже далеко не уйдёшь*/)
{
	data[index]=value;
}
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 14.09.2016 в 21:32.
OmegaBerkut вне форума Ответить с цитированием
Старый 14.09.2016, 21:40   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Что можно сделать либо методом, либо отдельно создать индексатор с его свойством, и отдельно создать свойство для массива
это ужасный костыль.
и жутко неудобно.

+ по факту этот код полностью аналогичен п1, так как у вас все равно полный доступ к массиву.
кроме того что он неудобен.

или же смотрите п3.

я не зря привел примеры того как работают стандартные классы.
и удобно вполне применять.
Цитата:
но, как я сказал, было бы "правильнее" вернуть элемент из массива, а не ссылку на весь массив.
ну так п3 с враппером вполне дает нужный эффект, и сохраняет чистоту коду.(и то враппер нужен только если нужны уведомления об изменениях, иначе п1)
и насчет правильнее, нет не правильнее, так как вы все равно дали доступ ко всему массиву, но зачем-то делаете это через одно место.
это как "на тебе ключи, но ты ходи через окно", разве это верный подход?
(+ делает невозможным многопоточный доступ в принципе)
Цитата:
Так можно делать и чтение, и запись. Так же будет работать следующий код:
в принципе так можно, если операции сложнее, чем банальное чтение.

знаете, я вас чуть подстегну, интересно что вы скажете о следующем коде:
Код:
        public static IEnumerable<MethodInfo> GetCompatibleMethods(this Type left, BindingFlags flags = BindingFlags.Public, IEnumerable<MethodInfo> with)
        {
            Contract.Requires<ArgumentNullException>(left != null, nameof(left));
            return GetCompatibleMethods(left, flags, with?.Select(s => new MethodSignature(s)) ?? new MethodSignature[0]);
        }
        public static IEnumerable<MethodInfo> GetCompatibleMethods(this Type left, BindingFlags flags = BindingFlags.Public, IEnumerable<MethodSignature> with)
        {
            Contract.Requires<ArgumentNullException>(left != null, nameof(left));
            Contract.Requires<ArgumentNullException>(with != null, nameof(with));
            foreach(var method in left.GetMethods(flags).Select(s=>new MethodSignature(s)))
            {
                if (with.Any(m => method.IsCompatibleWith(m)))
                    yield return method.Source;
            }
        }
        public static IEnumerable<MethodInfo> GetCompatibleMethods(this Type left, BindingFlags flags = BindingFlags.Public, params MethodInfo[] with)
        {
            Contract.Requires<ArgumentNullException>(left != null, nameof(left));
            return GetCompatibleMethods(left, flags, with?.Select(s => new MethodSignature(s)) ?? new MethodSignature[0]);
        }
        public static IEnumerable<MethodInfo> GetCompatibleMethods(this Type left, BindingFlags flags = BindingFlags.Public, params MethodSignature[] with)
        {
            Contract.Requires<ArgumentNullException>(left != null, nameof(left));
            return GetCompatibleMethods(left, flags, with ?? new MethodSignature[0]);
        }
реальный код, только из IDE
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.09.2016 в 21:45.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.09.2016, 21:48   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дополню следующим постом.

не усложняйте код на ровном месте.
вы из обычного доступа к массиву, зачем-то сделали карусель, напоминает синдром вахтера, честно
Цитата:
у меня в классе присутствует два private массива
и вы хотите дать доступ к элементам массивов.
так дайте доступ к массивам самим, и все будет удобно.(если set- не публичный, то заменить массив нельзя)
и в foreach можно будет легко их запихнуть и тп.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.09.2016, 21:59   #16
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
и насчет правильнее, нет не правильнее
Ваша аналогия имеет место быть, но то что есть я понимаю по другому:
я говорю, "принесите мне книжку №5 с книжной полки"; мне приносят книжную полку, с которой я выбираю книжку №5.
Я же ищу способ забрать книжку №5 без перемещения книжной полки.

На счёт "ужасного костыля" - я знаю, написал, что это дичь.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
знаете, я вас чуть подстегну, интересно что вы скажете о следующем коде
Ща, разобраться надо.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 14.09.2016, 22:02   #17
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

По приведённому коду: это нечто вроде энумератора методов. Больше ничего сказать не могу, ибо есть незнакомые мне конструкции, вроде "with?.Select". Что за знак вопроса перед точкой ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 14.09.2016, 22:04   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Ваша аналогия имеет место быть, но то что есть я понимаю по другому:
я говорю, "принесите мне книжку №5 с книжной полки"; мне приносят книжную полку, с которой я выбираю книжку №5.
Я же ищу способ забрать книжку №5 без перемещения книжной полки.
в моем случае, вам показывают на книжную полку, и говорят ищите сами.
вы же создали дополнительного персонажа, зачем? реально ли он нужен? почему нельзя самому взять книжку?
инкапсуляция это хорошо, но перегибать тоже не стоит.
Цитата:
Ща, разобраться надо.
MethodSignature - этот класс не ищите, это мой.
мне просто интересно, покоробит ли вас, 4 способа сделать одно и тоже или нет
(притом что из 4 методов, лишь один реально работает, а остальные лишь идут в него)
пояснять надо, зачем так?
Цитата:
Что за знак вопроса перед точкой ?
оператор условного null, если объект к которому я обращаюсь null, то обращение к нему тоже вернет null.
удобная замена if(value!=null)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.09.2016 в 22:06.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.09.2016, 22:12   #19
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
но перегибать тоже не стоит.
А что с ситуациями, когда нужно заменить один элемент массива ?
Код:
myclass.Data[i]=myclass.Data[j]; // Data - это свойство, определяющее доступ к массиву
Я так понимаю: тут берётся целый массив, в нём заменяется один элемент, и потом новый массив (или ссылка на него) записывается через свойство.
Я даже аналогию привести не могу, так как вижу тут "неявное пересоздание" массива (согласен с тем, что моё понимание в данном случае может быть неверным). А "правильнее" заменить один элемент.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 14.09.2016, 22:15   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Я так понимаю: тут берётся целый массив, в нём заменяется один элемент, и потом новый массив (или ссылка на него) записывается через свойство.
нет.
если продолжить про книжную полку, тут мы просто подошли к нужной книжной полке(на которую нам показали), и положили в нее книгу.
тут нет присвоения массива.
разложу это подробнее.
Код:
var data=myclass.Data
data[i]=data[j]
аналогичный код.
разве тут есть присвоение массива чему-то?

Цитата:
А "правильнее" заменить один элемент.
тут только замена одного элемента и есть.
нам только показывают где книжная полка.

массив не пересоздается при замене элементов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.09.2016 в 22:19.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Wordpress, как создавать отдельные рубрики для страниц? AlienNation WordPress и другие CMS 0 09.10.2012 11:42
Именованные таблицы DiemonStar Microsoft Office Excel 4 02.10.2012 18:02
Операции класса, индексаторы Rectangle 6666 Общие вопросы .NET 4 08.05.2012 11:31
Именованные ячейки Foxx Microsoft Office Excel 1 20.02.2012 00:33
Как в Delphi создавать и использовать скины для програм SeRhy Помощь студентам 3 20.12.2007 20:59