Re[9]: FDG
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.11.10 08:36
Оценка: -1
Здравствуйте, samius, Вы писали:

S>Есть IList<T>. Как узнать, можно ли изменить элемент через индексатор без исключений и даункастов?


IsReadOnly — изменить
IsFixedSize — добавить/удалить
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:36
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, samius, Вы писали:


A>>>Вообще-то, есть свойство IsFixedSize

S>>У другого интерфейса. Я просил без даункаста

A>Акстись, у какого другого?



A>
A>[ComVisible(true)]
A>public interface IList : ICollection, IEnumerable
A>


Мой вопрос был о IList<T>. Между ними ничего общего.
Re[9]: FDG
От: QrystaL Украина  
Дата: 25.11.10 08:46
Оценка:
S>Есть IList<T>. Как узнать, можно ли изменить элемент через индексатор без исключений и даункастов?

С индексатором похоже на баг.
Re[8]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:52
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, samius, Вы писали:


S>>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?


Q>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.


Мне вообще не понятно, к чему же таки относится это свойство.
var arr = new [] {1, 2};

((IList<int>)arr).IsReadOnly.Dump(); // True
((IList)arr).IsReadOnly.Dump();      // False
Re[14]: int[].Add
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:55
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, samius, Вы писали:


S>>Я бы удовлетворился стандартными контейнерами. Мне не нравится что интерфейсы не fine-grained.


A>Смысла в это всё равно нет, потому что я лично сам встречался со случаями когда коллекция ReadOnly/FixedSize иногда. Интерфейсами такое не обозначить.


Впрочем, можно было бы сделать аналог QueryInterface, который бы в динамике решал, возвращать ли или нет запрашиваемую грань.
Re[9]: FDG
От: Qbit86 Кипр
Дата: 25.11.10 08:57
Оценка:
Здравствуйте, samius, Вы писали:

Q>>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.


S>Мне вообще не понятно, к чему же таки относится это свойство.

S>
S>var arr = new [] {1, 2};

S>((IList<int>)arr).IsReadOnly.Dump(); // True
S>((IList)arr).IsReadOnly.Dump();      // False
S>


Я так понял (в код не заглядывал), имеет место Explicit Interface Implementation.

Всё-таки, при чём здесь индексатор?
Глаза у меня добрые, но рубашка — смирительная!
Re[10]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 09:00
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, samius, Вы писали:


Q>>>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.


S>>Мне вообще не понятно, к чему же таки относится это свойство.

S>>
S>>var arr = new [] {1, 2};

S>>((IList<int>)arr).IsReadOnly.Dump(); // True
S>>((IList)arr).IsReadOnly.Dump();      // False
S>>


Q>Я так понял (в код не заглядывал), имеет место Explicit Interface Implementation.

Это для меня постижимо. Логика такого решения — нет.

Q>Всё-таки, при чём здесь индексатор?

Я не знаю причем, но по какому свойству тогда ориентироваться, можно ли изменять элементы коллекции? Или это дыра в Optional Features Pattern?
Re[9]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 09:05
Оценка:
Здравствуйте, samius, Вы писали:

S>Мне вообще не понятно, к чему же таки относится это свойство.

S>
S>var arr = new [] {1, 2};

S>((IList<int>)arr).IsReadOnly.Dump(); // True
S>((IList)arr).IsReadOnly.Dump();      // False
S>

Продолжение квеста
dynamic ad = arr;
bool r = ad.IsReadOnly;
r.Dump(); // False
Re[11]: FDG
От: Qbit86 Кипр
Дата: 25.11.10 09:06
Оценка:
Здравствуйте, samius, Вы писали:

Q>>Всё-таки, при чём здесь индексатор?

S>Я не знаю причем, но по какому свойству тогда ориентироваться, можно ли изменять элементы коллекции? Или это дыра в Optional Features Pattern?

По свойству «read only» элемента коллекции (если такое свойство есть). К Optional Features Pattern'у, его альтернативам и вообще коллекциям/интерфейсам это не имеет совсем никакого отношения. Это вопрос глубокой/неглубокой иммутабельности, он ортогонален обсуждаемой теме.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: FDG
От: _FRED_ Черногория
Дата: 25.11.10 09:08
Оценка:
Здравствуйте, samius, Вы писали:

А>>>>>кто мне объяснит зачем мне доступен метод Add, который всегда будет кидать эксепшн?

Q>>>>«Framework Design Guidelines», глава «9.7 Optional Feature Pattern».
S>>>Есть рецепт, как можно понять, можно ли вызывать метод IList<T>.Add без получения исключения и даункастинга?

_FR>>В этом суть паттерна и заключена, что на все подобные кейсы "есть рецепт". Подробнее ознакомиться можно здесь.


S>Хорошо, как понять можно ли использовать индексатор списка на запись?


Я, признаться, удивлён: говорить о том, что коллекции сделаны не лучшим образом и не знать базовых интерфейсов коллекций

Единственная коллекция с таким свойством — массив, и специально для него было сделано IList.IsFixedSize Property. Об этом, если не ошибаюсь, даже Рихтер писал. Классику всё-таки по диагонали читать не следует, что бы не задавать потом подобных вопросов.
Help will always be given at Hogwarts to those who ask for it.
Re[10]: FDG
От: QrystaL Украина  
Дата: 25.11.10 09:09
Оценка:
S>Продолжение квеста
S>
S>dynamic ad = arr;
S>bool r = ad.IsReadOnly;
S>r.Dump(); // False
S>


With the new dynamic keyword in C# 4.0, a method call on a dynamic object is resolved at runtime. Is is therefore impossible to access the explicitly implemented member on a dynamic object.

Re[12]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 09:09
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, samius, Вы писали:


Q>>>Всё-таки, при чём здесь индексатор?

S>>Я не знаю причем, но по какому свойству тогда ориентироваться, можно ли изменять элементы коллекции? Или это дыра в Optional Features Pattern?

Q>По свойству «read only» элемента коллекции (если такое свойство есть). К Optional Features Pattern'у, его альтернативам и вообще коллекциям/интерфейсам это не имеет совсем никакого отношения. Это вопрос глубокой/неглубокой иммутабельности, он ортогонален обсуждаемой теме.

Причем здесь свойства элемента коллекции?

Есть метод
void SetValueIfCan(IList<T> list, int index, T value)
{
    // как узнать, можно ли вызывать сеттер?
    list[0] = value;
}
Re[5]: int[].Add
От: _FRED_ Черногория
Дата: 25.11.10 09:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>конкретные вещи:

А>>>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс.
А>>>Я не могу вставить вилку 220 в 360.
А>>>Считай, что метод Add это вставки вилки в розетку

_FR>>А кто вам _обещал_ какую-то конкретную розетку или вилку? Чем одна розетка\вилка лучше другой? Ничем, они равноправны. А переходники у любого _квалифицированного_ путешественника должны быть в наличии. Из приведённого вами примера виднен лишь недостаток квалификации


_FR>>Продолжайте, весилите публику в том же духе.


А>по сути ответа на конкретный пример не услышал — следовательно, сказать нечего


Я тоже не услышал выше ответов по сути. Однако вы что-то всё-таки в ответ, не по сути, но сказали. Следовательно, ваш вывод о том, что сказать нечего мне — ошибочен. Качайтесь :о)
Help will always be given at Hogwarts to those who ask for it.
Re[5]: FDG
От: _FRED_ Черногория
Дата: 25.11.10 09:11
Оценка:
Здравствуйте, samius, Вы писали:

S>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?


Ну ёлки-палки. Неужели так сложно погуглить и почитать о том, что означают свойства базовых интерфейсов коллекций И как можно о чём-то говорить, не имея таких примитивных знаний?
Help will always be given at Hogwarts to those who ask for it.
Re[6]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 09:13
Оценка:
Здравствуйте, _FRED_, Вы писали:

S>>Хорошо, как понять можно ли использовать индексатор списка на запись?


_FR>Я, признаться, удивлён: говорить о том, что коллекции сделаны не лучшим образом и не знать базовых интерфейсов коллекций


_FR>Единственная коллекция с таким свойством — массив, и специально для него было сделано IList.IsFixedSize Property. Об этом, если не ошибаюсь, даже Рихтер писал. Классику всё-таки по диагонали читать не следует, что бы не задавать потом подобных вопросов.


FRED, я зол!
Ты даже не второй, кто мне предлагает для ответа на вопрос, можно ли по IList<T> узнать о возможности использования сеттера индексатора без даункаста, воспользвоаться IList-ом.
Благодарю за "внимательность".
Re[9]: FDG
От: _FRED_ Черногория
Дата: 25.11.10 09:15
Оценка:
Здравствуйте, samius, Вы писали:

S>>>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?


A>>Вообще-то, есть свойство IsFixedSize

S>У другого интерфейса. Я просил без даункаста

Нет, вы действительно Рихтера не читали? Хоть одну коллекцию кроме массива можете привести в качестве примера, в которой был бы нужен IsFixedSize? Именно поэтому, потому что было сложно в большенстве голов уложить как IsFixedSize так и IsReadOnly, а так же из-за того, что кроме массива это более нигде было не нужно, в generic-коллекциях от этого отказались, оставив лишь IsReadOnly. Архитекторы блин, недоученные.
Help will always be given at Hogwarts to those who ask for it.
Re[6]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 09:15
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, samius, Вы писали:


S>>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?


_FR>Ну ёлки-палки. Неужели так сложно погуглить и почитать о том, что означают свойства базовых интерфейсов коллекций И как можно о чём-то говорить, не имея таких примитивных знаний?


http://msdn.microsoft.com/en-us/library/bb346454.aspx

A collection that is read-only does not allow the addition, removal, or modification of elements after the collection is created.


Погуглил. После этого ты будешь утверждать что изменение элементов массива запрещено?
Re: int[].Add
От: ylem  
Дата: 25.11.10 09:18
Оценка:
А>кто мне объяснит зачем мне доступен метод Add, который всегда будет кидать эксепшн?

У АйЛист, кажись, ИзФиксдСайз было(?)
Так что Вам следует негодовать по поводу дизайна интерфейса, а не вот этой его реализации.
Re[7]: FDG
От: _FRED_ Черногория
Дата: 25.11.10 09:19
Оценка:
Здравствуйте, samius, Вы писали:

S>>>Хорошо, как понять можно ли использовать индексатор списка на запись?

_FR>>Я, признаться, удивлён: говорить о том, что коллекции сделаны не лучшим образом и не знать базовых интерфейсов коллекций

_FR>>Единственная коллекция с таким свойством — массив, и специально для него было сделано IList.IsFixedSize Property. Об этом, если не ошибаюсь, даже Рихтер писал. Классику всё-таки по диагонали читать не следует, что бы не задавать потом подобных вопросов.


S>FRED, я зол!

S>Ты даже не второй, кто мне предлагает для ответа на вопрос, можно ли по IList<T> узнать о возможности использования сеттера индексатора без даункаста, воспользвоаться IList-ом.
S>Благодарю за "внимательность".

Ну если ответ небыл известен, что плохого в том, что ответ получен несколько раз А если всё-таки был известен: почему не указать этого в сразу — мы же не подсекаем тут друг друга, подлавливая на ошибках и пытаясь выяснить, у кого больше, а пытаемся узнать, как лучше. Вот если ответ был известен, надо было бы так и написать, что IsFixedSize нет и без него никак. Ну а если забыли — ну и что что несколько раз напомнили?
Help will always be given at Hogwarts to those who ask for it.
Re[13]: Банка ReddBull'а впрок не пошла
От: Qbit86 Кипр
Дата: 25.11.10 09:20
Оценка:
Здравствуйте, samius, Вы писали:

Q>>>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.


Да, вопрос терминологии, говорили о разных вещах. Точнее, я изначально понял всё превратно, зачем-то добавил лишний уровень косвенности, евпочя.

S>Есть метод

S>
S>void SetValueIfCan(IList<T> list, int index, T value)
S>{
S>    // как узнать, можно ли вызывать сеттер?
S>    list[0] = value;
S>}
S>


В такой формулировке признаю вопрос корректным.
Глаза у меня добрые, но рубашка — смирительная!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.