В чем разница между статическим классом и нормальным классом?

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

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

Ответы

Ответ 1

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

Например, 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;
    }       
}

Ответ 2

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

Ответ 3

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

var normal = new Normal();

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

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

Ответ 4

Из Документация MSDN по статическим классам:

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

Ответ 5

Простыми словами:

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

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

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

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

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

A static class is singleton by default.

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

представьте их.

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

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

Ответ 9

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

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

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