Разработчики Java ненавидят сложность C++, поэтому язык Java очень краток, а GC также делает управление памятью очень удобным. C# заинтересован в Java GC и технологии виртуальных машин и надеется интегрировать несколько основных языков Microsoft в .NET. . Таким образом, C# не является простым или даже сложным с точки зрения языка.
Идеи дизайна этих двух языков также различны. Java — это компилируемый и интерпретируемый язык, а C# — это компилируемый, а затем компилируемый и запускаемый язык. В Java нет делегатов, в C# есть делегаты. Java имеет тенденцию использовать интерфейс для реализации функций делегата, тогда как в C# абстрактный класс играет большую роль, чем интерфейс.
Java следует правилам именования Camel, а C# следует правилам именования Pascal. Но теперь все больше и больше людей, использующих Java, начинают использовать C#, и в то же время они привносят в C# «верблюжьи» правила именования, что может сделать код C# все более и более трудным для чтения. Почему C# вообще не последовал примеру Camel? Я не вижу ничего плохого в системе именования верблюдов.
1. Имя класса.Этот и внутренний класс
В Java мы часто видим использование, подобное имени класса. Это текущий экземпляр объекта. Почему перед ним появляется имя класса? Программисты C# будут сбиты с толку этим.
В Java внутренние классы используются во многих местах, и к членам внешнего класса можно получить доступ даже во внутреннем классе. В этот раз при использовании this во внутреннем классе возникнет вопрос, кто это и что это такое. означает. Это текущий экземпляр объекта внутреннего класса или текущий экземпляр объекта внешнего класса?
В Java добавление имени внешнего класса перед этим означает, что текущий экземпляр объекта внешнего класса используется во внутреннем классе.
Давайте посмотрим на пример ниже.
//Определение внешнего класса
общественный класс OuterClass {
//Определение внутреннего класса
частный класс InnerClass
{
// Во внутреннем классе не определен член с идентификатором. Здесь мы получаем доступ к членам внешнего класса.
public int getId() { return OuterClass.this.id };
public void setId(int id) { OuterClass.this.id = id;}
// Член name определен во внутреннем классе, и доступ к членам внутреннего класса осуществляется напрямую. По умолчанию это доступ к членам текущего класса.
частное имя строки;
public String getName() { return this.name;}
// Вы можете добавить имя внутреннего класса перед этим
public void setName(String name) {InnerClass.this.name = name;}
// Внутренний класс также может получить доступ к членам внешнего класса с тем же именем, и необходимо добавить имя внешнего класса.
public String getOuterName() { return OuterClass.this.name;}
public void setOuterName(String name) { OuterClass.this.name = name;}
@Override
публичная строка toString()
{
return "Id: " + this.getId() + ", внутреннее имя: " + this.getName() + ", внешнее имя: " + this.getOuterName();
}
}
//Идентификатор и имя члена, определенные во внешнем классе
частный внутренний идентификатор;
частное имя строки;
частный InnerClass InternalInstance;
общественный ВнешнийКласс()
{
this.innerInstance = новый InnerClass();
this.innerInstance.setId(20);
this.innerInstance.setName("Том");
this.innerInstance.setOuterName("Алиса");
}
публичная строка toString()
{
вернуть this.innerInstance.toString();
}
}
В C# классы делятся на вложенные и невложенные классы. Первый — это класс, объявленный внутри других типов данных. Последний представляет собой класс, определенный непосредственно в определенном пространстве имен. Вложенные классы редко определяются в C#.
Невстроенные классы позволяют использовать только общедоступные и внутренние элементы управления доступом, тогда как встроенные классы позволяют использовать все пять символов управления доступом: частный, защищенный, внутренний защищенный, общедоступный и внутренний. Внутренние классы также могут получить доступ ко всем методам внешнего класса, включая методы экземпляра и частные методы, но им необходимо явно передать экземпляр внешнего класса.
Внутренние классы в C# могут использовать типы и статические методы, определенные внешними классами, но не могут напрямую использовать методы экземпляров внешних классов. Таким образом, вышеуказанной проблемы не существует.
В C# внешний класс действует скорее как пространство имен для внутреннего класса. Если позволяет контроль доступа, вы можете использовать следующий метод для создания экземпляра объекта внутреннего класса.
OuterClass.InnerClass obj = new OuterClass.InnerClass() Этот экземпляр не имеет прямой связи ни с одним экземпляром внешнего класса. Аналогично статическим внутренним классам в Java.
2. Имя класса.класс и тип.
В Java мы часто видим использование класса name.class. Это использование эквивалентно typeof (имя класса) в C#, которое используется для получения ссылки на экземпляр объекта типа.
В Java каждому классу соответствует соответствующий объект Class. Когда класс пишется и компилируется, в сгенерированном файле .class создается объект Class, представляющий информацию о типе класса. Три способа получить экземпляры классов:
Получите экземпляр класса объекта, вызвав метод getClass() экземпляра объекта.
Используйте статический метод forName() класса, чтобы получить экземпляр класса, используя имя класса. Class.forName(xxx.xx.xx) возвращает класс. Его функция — попросить JVM найти и загрузить указанный класс, что означает, что JVM выполнит сегмент статического кода класса.
Получите экземпляр класса, используя имя класса .calss. Для классов инкапсуляции базовых типов данных вы также можете использовать .TYPE для получения экземпляра класса соответствующего базового типа данных.
Способ получения экземпляра объекта типа в C# проще и понятнее.
Получается путем вызова метода GetType() экземпляра данных. Этот метод унаследован от Object, поэтому любой объект в C# имеет метод GetType(), x.GetType(), где x — имя переменной.
x в typeof(x) должно быть конкретным именем класса, именем типа и т. д. и не может быть именем переменной.
С помощью статического метода System.Type.GetType() класса System.Type.
3. Анонимный класс
В Java анонимные классы тоже используются чаще. Например, в Android при реализации мониторинга кнопок вы часто видите такой код.
@Override
public void onClick (View arg0) {
Намерение намерение = новое намерение (MainActivity.this, ActivityFrameLayout.class);
setTitle("FrameLayout");
StartActivity (намерение);
}
};
Здесь OnClickListenter на самом деле является интерфейсом. Можно ли использовать этот интерфейс для создания экземпляров объектов? Конечно, нет.
Таким образом, Java автоматически создает анонимный класс, который реализует здесь интерфейс. То, что мы создаем, на самом деле является экземпляром объекта этого анонимного класса.
Преимущество этого в том, что нам не нужно определять класс, который используется только один раз, а затем создавать экземпляры объектов с помощью этого класса, что упрощает разработку программы.
Например, у нас есть следующий интерфейс.
instance.onClick(); В C# мы вообще не будем использовать эту форму. С помощью делегирования ту же функцию можно реализовать очень просто.
Обратите внимание, что в Java нет делегатов.
Если мы напечатаем тип этого экземпляра, вы увидите фактический тип этого анонимного класса.
Концепция атрибутов должна быть знакома каждому. Функции-члены класса могут свободно обращаться к любому члену атрибута в этом классе. Однако из одного класса получить доступ к свойствам другого класса сложнее, поэтому мы часто используем методы Getxxx и Setxxx, что выглядит крайне неестественно. Например, в Java или C++ код выглядит так:
Однако в C# такие методы «приписываются». Тот же код на C# выглядит следующим образом:
фу.размер++;
label.font.bold = правда;
Как видите, C# явно легче читать и понимать. Аналогичную ситуацию мы также можем видеть в коде подпрограммы этого «метода свойства»:
Ява/С++:
С#:
Чтобы отличить этот тип метода с атрибутами от членов атрибута класса, члены атрибута в C# называются «полями», а «атрибут» становится специальным существительным для этого «метода с атрибутами». Кстати, такой метод атрибута часто встречается в VB и DELPHI. В VB его еще называют атрибутом. Кроме того, в C# свойства Get и Set не могут иметь только Get без Set (в Java и C++ оно может иметь только Get или только Set). Если вы хотите изменить определенный атрибут, вы одновременно обратите внимание на методы Get и Set и измените их. Вы не измените это и не забудете об этом.
5. Механизм индексации объектов (Indexer)
Механизм индексации объектов был представлен в C#. Проще говоря, индекс объекта на самом деле представляет собой массив объектов. Давайте поговорим об этом в связи со свойствами в предыдущем разделе. Свойства должны скрывать методы Get и Set, но в механизме индексирования методы Get или Set каждого объекта отображаются. Например, следующий пример иллюстрирует этот момент более четко. Вышеупомянутое представляет различия между C# и Java.
истории [индекс] = ценность;
}
}
}
...
}
Вышеупомянутое знакомит с различиями между C# и JAVA. Надеюсь, вам будет полезно понять C# и JAVA.