2010-05-28 13 views
14

Когда я предпочитаю статический или нормальный класс? Или: в чем разница между ними?В чем разница между статическим классом и нормальным классом?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace staticmethodlar 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SinifA.method1(); 
     } 
    } 

    static class SinifA 
    { 
     public static void method1() 
     { 
      Console.WriteLine("Deneme1"); 
     } 
    } 

    public static class SinifB 
    { 
     public static void method2() 
     { 
      Console.WriteLine("Deneme2"); 
     } 
    } 
    public class sinifC 
    { 
     public void method3() 
     { 
      Console.WriteLine("Deneme3"); 
     } 
    } 

    public class sinifD : sinifC 
    { 
     void method4() 
     { 
      Console.WriteLine("Deneme4"); 
     } 

     sinifC sinifc = new sinifC(); // I need to use it :) 
    } 
} 
+0

Связанный вопрос http://stackoverflow.com/questions/1493862/making-methods-all-static-in-class – R0MANARMY

+3

Возможный дубликат [C# - Что такое «статический» класс?] (Http: // stackoverflow .com/questions/695056/c-what-is-a-static-class) –

ответ

24

Статические классы содержат статические объекты, которые не могут быть созданы несколько раз. Обычно я использую статические классы для размещения статических методов, которые обеспечивают вычисления, общие шаблоны обработки, форматы вывода строк и т. Д. Статические классы имеют небольшой вес и не требуют создания экземпляров.

Например, System.IO.File является статическим классом со статическим методом Exists(). Вы не создаете объект File для его вызова.Вы ссылаться на него как этот

System.IO.File.Exists(filePath)

Вместо того, чтобы делать это

System.IO.File myFile = new System.IO.File(filePath);

if(myFile.Exists()) { /* do work */ }

Если вам требуется несколько объектов в программном обеспечении, то вы используете динамические классы. Например, если у вас есть система инвентаризации может иметь несколько Product объектов и в том случае, если вы будете использовать динамический класс, как этот

public class Product 
{ 

    public int ProductID { get; private set; } 
    public string ProductName { get; private set; } 
    public int Qty   { get; set; } 

    public Product(int productID, string productName, int total) 
    { 
     this.ProductID = productID; 
     this.ProductName = productName; 
     this.Qty = total; 
    }  
} 
3

MSDN documentation on static classes С:

Класс может быть объявлен статическим, указывая, что он содержит только статические члены. Невозможно создать экземпляры статического класса с использованием нового ключевого слова. Статические классы загружаются автоматически с помощью среды выполнения Common Framework .NET Framework (CLR), когда загружается программа или пространство имен, содержащее класс.

+0

задается вопросом, для чего предназначены все эти GB-документы. –

+0

Был ли действительно необходим комментарий «Научиться читать документы»? Конечно, я отвечу на ваш вопрос, но покажу вам, что такое интеллектуально превосходящее @ss я могу быть. Счастливая пятница! – DenaliHardtail

+1

@WaggingSiberian: Предоставляя ему преимущество, это первый результат Google для поисковой фразы ** статический класс C# **, да, это было необходимо. Я не хочу делать поиск в Google, прежде чем отправлять вопрос - это необоснованное требование. – R0MANARMY

4

Вы можете создавать экземпляры «нормальных» классов через конструктор классов.

var normal = new Normal(); 

Вы не можете создавать экземпляры статических классов. Они могут иметь только статические методы.

Также стоит отметить, что вы должны объявить extension methods в статических классах.

+0

ok, когда я использую статический класс? – Penguen

+1

Хороший вопрос о методах расширения. – R0MANARMY

0

Статические элементы можно вызывать без использования экземпляра класса. Например, статический класс Math с вызовом метода Area вызывается Math.Area, не создавая первый класс Math.

13
  • Статические классы не могут быть instantiated или inherited.
  • статические классы отмечены как sealed и abstract компилятором в выводе MSIL.
  • все элементы статических классов также должны быть статическими.
  • только статические классы могут размещать extension methods.
  • Статические классы не могут использоваться как общие аргументы типа.
+0

Не могли бы вы рассказать мне больше о «только статические классы могут принимать методы расширения». Почему обычные классы не могут использовать методы exetension? Спасибо! – Catbuilts

1

Проще говоря:

Статический класс не может быть создан с помощью ключевого слова new. Все методы в статическом классе должны быть статическими и могут быть вызваны непосредственно без создания экземпляра.

«Обычный» класс ДОЛЖЕН быть создан, однако любые статические методы в «нормальном» классе могут быть вызваны без создания экземпляра.

Нестационарные методы в «нормальном» классе нельзя вызывать без первого экземпляра содержащего класса.

+0

Тогда какая разница между статическим классом, имеющим функцию Method1() и нормальный класс со статической функцией Method1(). И какой сценарий мы будем использовать вышеописанным способом .. –

0

Статический класс один, который не может быть реализован. Поэтому его можно использовать в качестве «шаблона» для нескольких экземпляров некоторого объекта, который соответствует определению класса, как обычный класс. В нормальном классе определенные члены данных создаются для каждого «экземпляра» класса и каждый «экземпляр» имеет собственный набор этих элементов данных, поэтому эти экземпляры представляют отдельные «сущности» или сложные структуры данных в памяти для некоторого объекта (который вы закодировали представляемый класс).

Когда вы определяете (код) статический класс, все его поля данных также должны быть статическими, то есть они не могут быть созданы один раз для каждого экземпляра класса (вы можете создавать экземпляры статического класса). Статические классы полезны только тогда, когда вы просто нужен контейнер для хранения методов, которые не зависят от состояния какого-либо объекта или структуры данных, управляемой приложением (например, функция добавления или форматирование строк и т. д.).)

0

Обычный класс - это тот, который вы можете создать и использовать с объектами.

Статический класс - это тот, который не может быть инстансирован и не может быть расширен.

Это означает, что a static class is sealed and abstract по умолчанию, вы можете посмотреть на

MSIL статического класса компилятор помещает герметизируют и абстрактный перед статическим классом.

Так, так как статический класс не может быть создан, вы не можете иметь методы экземпляра определены

на статических классов, поэтому все методы должны быть статическими и общественности, как конечно вы хотели бы

используй их.

A static class is singleton by default. 

Статические классы используются для определения методов расширения, потому что вы не хотите

instansiate них.

Статические классы, как мировой поставщик уникальных услуг.

Надеюсь, это имеет смысл для вас и поможет вам понять статические классы.

0

Это может помочь подумать о «статическом» и «экземпляре» с точки зрения адресации памяти.

Объект, который является статическим, существует в одном и только одном месте в памяти; вы не можете создавать экземпляры, потому что по определению было указано, что оно будет найдено в одном конкретном месте.Он «статический» и неизменный. Создание объекта является неявным, а не явным.

var result = Math.Pow(3, 3); // static - Math class can't be instanced 

Объект, который не является статическим, может быть установлен один или несколько раз; вы говорите: «Создайте для меня объект этого типа», и этому объекту задан адрес памяти. Вы можете создать несколько экземпляров, все из которых существуют в разных адресах памяти. Создание объекта является явным, используя ключевое слово new.

var Ted = new Employee(); // instance - creates a new object at a new address 

Здесь люди сталкиваются с проблемами в веб-программировании ASP.NET; статические классы создаются один раз в домене приложений, и их конструкторы поэтому вызывается только один раз.