Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переход с Java на C# 
:(
    Опции темы
math64
Дата 25.11.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



В Java по умолчанию доступ к полям имеют классы из того же пакета. В C++ для этого используется friend. Есть ли что-нибудь такое в C# ?
PM   Вверх
Partizan
Дата 25.11.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



math64, ну может быть internal....


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Veitmen
Дата 25.11.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



В .net это internal.

Это сообщение отредактировал(а) Veitmen - 25.11.2008, 13:04
PM MAIL ICQ   Вверх
Дрон
Дата 25.11.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(math64 @  25.11.2008,  12:55 Найти цитируемый пост)
В Java по умолчанию доступ к полям имеют классы из того же пакета. В C++ для этого используется friend. Есть ли что-нибудь такое в C# ? 

По-умолчанию в C# все члены класса private.
Как уже сказали аналог доступа по-умолчанию из Java это internal.

Но есть одна тонкость: ближайший аналог package из Java в C# это namespace, но при этом namespace не используется для разграничения доступа, вместо этого используется assembly (сборка).

Т.е. в Java классы из двух пакетов: myApp.package1 и myApp.package2 не будут иметь доступа к полям друг друга. А в .NET будут, если эти классы находятся в одной сборке (грубо говоря -- в одной dll-ке).

Может я немного мутно объяснил -- лучше будет почитать MSDN smile


--------------------
Да. Именно так.
PM   Вверх
math64
Дата 2.12.2008, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



А что есть аналог myClass.class ?
obj.GetType() вернёт действительный тип объекта, и не применим если нужно получить тип абстрактного класса или интерфейса.

То, что нужно можно получить так:
Код

new MyType[0].GetType().GetElementType()

Нашел:
Код

typeof(MyType)


Это сообщение отредактировал(а) math64 - 2.12.2008, 10:02
PM   Вверх
math64
Дата 3.12.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



Вложенные (не static) классы на Java имеют скрытый указатель this на внешний класс. В C# этого нет. Нужно создавать такой указатель вручную?
PM   Вверх
PashaPash
Дата 4.12.2008, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(math64 @  3.12.2008,  16:44 Найти цитируемый пост)
Вложенные (не static) классы на Java имеют скрытый указатель this на внешний класс. В C# этого нет. Нужно создавать такой указатель вручную? 

В C#/.NET объект вложенного класса никак не связан с внешним, и вообще является самостоятельным независимым типом. Вложенность - только способ ограничить область видимости, т.е. классы точно так же "вкладываются" в namespace, как и в друг друга.


--------------------
PM MAIL WWW   Вверх
archeg
Дата 4.12.2008, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



Цитата(math64 @ 3.12.2008,  16:44)
Вложенные (не static) классы на Java имеют скрытый указатель this на внешний класс. В C# этого нет. Нужно создавать такой указатель вручную?

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


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
nikitao
Дата 4.12.2008, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 4
Всего: 26



Цитата(PashaPash @  4.12.2008,  02:00 Найти цитируемый пост)
В C#/.NET объект вложенного класса никак не связан с внешним, и вообще является самостоятельным независимым типом. Вложенность - только способ ограничить область видимости, т.е. классы точно так же "вкладываются" в namespace, как и в друг друга. 

Может автор имел ввиду , что класс имеет ссылку на класс , что его породил...


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
math64
Дата 4.12.2008, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



В случае если вложенный класс реализует интерфейс с одним методом, он заменяется на delegate, доступ к классу через свойство Target
Код

public interface IJava {
void f();
}

public class Outer {
  public class Inner implements IJava {
    public void f() {
      // Inner имеет указатель Outer.this и может вызвать нестатический метод внешнего класса
      outer_f();
    }
  }

  void g() {
    IJava iJava = new Inner();
    iJava.f();
  }

  void outer_f() {
  }
}

Код

public class Outer
{

  public delegate void CSharpDelegate();

  void g()
  {
     CSharpDelegate d = new CSharpDelegate(outer_f);
     d(); 
  }

  void outer_f()
  {
  }
}

Но если во вложенном классе несколько методов, заменить его на delegate нельзя, нужно в конструкторе вложенного класса передавать указатель на внешний, при этом:
Код


Код

public class Outer {
  public class Inner
  {
    Outer outer;
    public Inner(Outer p_outer)
    {
      outer = p_outer;
    }
  }

  Inner inner = new Inner(this); // возникает ошибка
}

нужно переписывать так:
Код

public class Outer {
  public class Inner
  {
    Outer outer;
    public Inner(Outer p_outer)
    {
      outer = p_outer;
    }
  }

  Inner inner;

  public Outer ()
  {
    inner = new Inner(this);
  }
}


PM   Вверх
Zakonnic
Дата 4.12.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 25.4.2006

Репутация: 2
Всего: 6



Ээээ... чисто ради интереса - это значит, что в джаве можно привести экземпляр внутреннего класса к внешнему? Получается, что это просто наследование таким оригинальным способом?
--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
math64
Дата 4.12.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



Outer.this  в Java доступен только внутри внутреннего класса. Обычно этот указатель явно не используется (как и Target в делегатах C#).
PM   Вверх
PashaPash
Дата 4.12.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



math64, в Java Inner можно использовать только внутри Outer, т.е. каждый объект Inner существует только внутри объекта Outer. В C# Inner можно использовать вообще откуда угодно, т.к. он ничем кроме места объявления к Inner не привязан. Т.е. можно сделать вот так:
Код

class Outer
{
    public class Inner
    { 
    
    }
}

class Program
{
    static void Main(string[] args)
    {
        Outer.Inner inner = new Outer.Inner(); 
    }
}

и получить объект типа Inner никак не привязаный к объекту Outer.


--------------------
PM MAIL WWW   Вверх
math64
Дата 5.12.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



PashaPash, в Java Inner тоже может использоваться вне Outer.
Перевод твоего кода в Java:
Код

public class Outer
{
    // Вложенный static-класс ведёт себя как в C#
    public static class Inner
    { 
    
    }
}

public class Program
{
    public static void main(String[] args)
    {
        Outer.Inner inner = new Outer.Inner(); 
    }
}

Не static:
Код

public class Outer
{
    public class Inner
    { 
    
    }
}

public class Program
{
    public static void main(String[] args)
    {
        Outer outer = new Outer();
        //Вложенный не static-класс можно создать вне внешнего класса, но нужно экземпляр внешнего класса
        Outer.Inner inner = outer.new Inner(); 
    }
}

Перевод второго фрагмента на C#:
Код

public class Outer
{
    public class Inner
    { 
       private Outer outer;

       public Inner(Outer p_outer)
       {
          outer = p_outer;
       }
    }
}

public class Program
{
    public static void Main(String[] args)
    {
        Outer outer = new Outer();
        Outer.Inner inner = new Outer.Inner(outer); 
    }
}

И в Java, и в C# вложенный класс является "другом" внешнего и имеет доступ к его private полям


Это сообщение отредактировал(а) math64 - 5.12.2008, 11:12
PM   Вверх
PashaPash
Дата 5.12.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



math64, в случае public static class Inner у Inner нет ссылки на Inner? Гугл подсказывает что static inner на самом деле делает его не inner
Цитата
When you declare a member class with a static modifier, it becomes a nested top-level class and can be used as a normal top-level class as explained above. 

Тогда в C# все netsted классы являются static в этом смысле, и поменять это никак нельзя. IMHO, фишка настолько редко используется, что лишние 5 строчек на C# никого не напрягают. В java в ней есть смысл из-за активного использования анонимных классов для event handler-ов. В C# вместо этого используются анонимные методы, без создания доп. обертки в виде класса, и с возможностью обращатся к this.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.