Как реализовать передачу параметров по ссылке на const?
От: Labutin  
Дата: 21.01.07 10:15
Оценка:
Объекты в качестве параметров методам передаются по ссылке. Соответственно их могут в методе модифицировать.
Хочу написать метод, который принимает объекты по ссылке на const (как это часто происходит в C++). Как это сделать?
const в заголовке метода никуда не подходит — говорит ошибка
Re: Как реализовать передачу параметров по ссылке на const?
От: Denis2005 Россия  
Дата: 21.01.07 11:30
Оценка:
Здравствуйте, Labutin, Вы писали:

L>Объекты в качестве параметров методам передаются по ссылке. Соответственно их могут в методе модифицировать.

L>Хочу написать метод, который принимает объекты по ссылке на const (как это часто происходит в C++). Как это сделать?
L>const в заголовке метода никуда не подходит — говорит ошибка

Могу посоветовать сделать generic-обертку над передаваемым типом (если конечно речь идет о C# 2.0):

struct const_ref<T>
{
    readonly T t;

    const_ref(T t)
    {
        this.t = t;
    }

    public static implicit operator T (const_ref<T> crt)
    {
        return crt.t;
    }

    public static const_ref<T> make(T t)
    {
        return new const_ref<T>(t);
    }
}

class Test
{
    public static void Proc(const_ref<int> ci, const_ref<string> cs)
    {
        int i = ci; // ok
        string s = cs; // ok
            
        ci = 10; // failed
        cs = "ldkfl;"; // failed
    }

    public static void Call()
    {
        Proc(const_ref<int>.make(10), const_ref<string>.make("sdjkfjsld"));
    }
}


Более простого решения я не вижу, во всяком случае в плане эффективности.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как реализовать передачу параметров по ссылке на cons
От: Константин Л. Франция  
Дата: 21.01.07 14:42
Оценка:
Здравствуйте, Denis2005, Вы писали:

не спасет от изменения мемберов
Re[3]: Как реализовать передачу параметров по ссылке на cons
От: Denis2005 Россия  
Дата: 21.01.07 15:06
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>не спасет от изменения мемберов


Понятно, что без нормальной поддержки константности со стороны языка эта проблема не решается.
Обычно в качестве решения приводят глубокое копирование, что мягко говоря совсем .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Как реализовать передачу параметров по ссылке на cons
От: NoOneKnows  
Дата: 21.01.07 15:29
Оценка: 12 (1)
Здравствуйте, Denis2005, Вы писали:

D> ... что мягко говоря совсем .


Может, покажется интересным почитать интервью с Anders Hejlsberg'ом?

1. Ищите слово Immutables (с учетом регистра): CLR Design Choices
2. Ищите "Are you asking why we don’t have": Transcript: Whiteboard with Anders Hejlsberg
С уважением, Рамиль Сам Ду Нар.
Почти самый отрицательный
Автор: NoOneKnows
Дата: 08.06.06
РСДНовец.
Re[5]: Как реализовать передачу параметров по ссылке на cons
От: Denis2005 Россия  
Дата: 21.01.07 16:13
Оценка:
Здравствуйте, NoOneKnows, Вы писали:

NOK>Может, покажется интересным почитать интервью с Anders Hejlsberg'ом?


NOK>1. Ищите слово Immutables (с учетом регистра): CLR Design Choices

NOK>2. Ищите "Are you asking why we don’t have": Transcript: Whiteboard with Anders Hejlsberg

Это всё старо как мир. Честно говоря домыслы Hejlsberg-а мне всегда были мало интересны.
Его взгляды на const давно известны и их далеко не все разделяют.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как реализовать передачу параметров по ссылке на cons
От: _FRED_ Черногория
Дата: 21.01.07 18:13
Оценка: 1 (1) +1
Здравствуйте, Denis2005, Вы писали:

L>>Объекты в качестве параметров методам передаются по ссылке. Соответственно их могут в методе модифицировать.

L>>Хочу написать метод, который принимает объекты по ссылке на const (как это часто происходит в C++). Как это сделать?
L>>const в заголовке метода никуда не подходит — говорит ошибка

D>Могу посоветовать сделать generic-обертку над передаваемым типом (если конечно речь идет о C# 2.0):


А можешь написать код, в котором без твоего
D>struct const_ref<T>
D>{
    // …
D>}

что-то не работает?

Вот посмотри следующий пример:
public static void Proc(int ci, string cs)
{
  int i = ci; // ok
  string s = cs; // ok
            
  ci = 10; // ok (*)
  cs = "ldkfl;"; // ok (**)
}

и расскажи, какие проблемы и где могут возникнуть из-за того, что строки (*) и (**) удачно компилируются
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Как реализовать передачу параметров по ссылке на cons
От: Константин Л. Франция  
Дата: 22.01.07 11:03
Оценка:
Здравствуйте, Denis2005, Вы писали:

D>Здравствуйте, Константин Л., Вы писали:


КЛ>>не спасет от изменения мемберов


D>Понятно, что без нормальной поддержки константности со стороны языка эта проблема не решается.

D>Обычно в качестве решения приводят глубокое копирование, что мягко говоря совсем .

да и пример ты привел не в тему. Без твоего const_ref и ref'а C#'па в методы передаются копии ссылок. Автор наверняка хотел именно запрет на изменение мемберов.
Как реализовать передачу параметров по ссылке на const?
От: Аноним  
Дата: 21.01.07 10:53
Оценка:
CLR — не поддерживает такой возможности, соответственно это и не реализовано в C#.

С ув. Сергей.

История — это огромная система раннего предупреждения.
Norman Cousins


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.