В чем разница между статическим классом и обычным классом? - PullRequest
18 голосов
/ 28 мая 2010

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

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 :)
    }
}

Ответы [ 9 ]

30 голосов
/ 28 мая 2010

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

Например, 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;
    }       
}
15 голосов
/ 28 мая 2010
  • статические классы не могут быть instantiated или inherited.
  • статические классы помечены компилятором как sealed и abstract в выходном MSIL.
  • все члены статических классов также должны быть статическими.
  • только статические классы могут содержать extension methods.
  • статические классы нельзя использовать в качестве аргументов универсального типа.
4 голосов
/ 28 мая 2010

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

var normal = new Normal();

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

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

3 голосов
/ 28 мая 2010

Из документации MSDN о статических классах :

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

1 голос
/ 28 мая 2010

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

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

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

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

0 голосов
/ 28 мая 2010

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

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

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; статические классы создаются один раз для каждой области приложения, и поэтому их конструкторы вызываются только один раз.

0 голосов
/ 28 мая 2010

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

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

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

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

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

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

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

A static class is singleton by default.

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

инстанцирует их.

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

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

0 голосов
/ 28 мая 2010

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

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

0 голосов
/ 28 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...