Является ли статическая функция правильной практикой кодирования в этом случае с точки зрения производительности и использования ресурсов? - PullRequest
1 голос
/ 06 мая 2011

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

Вот пример кода, который я должен реализовать, который просто показывает формы:

    private void btn1_Click(object sender, EventArgs e)
    {
        Form1 frm = new Form1();
        frm.ShowDialog();
    }

Теперь я должен показать это Form1 от многихдругие формы в моей программе.Поэтому лучше (правильная практика написания кода) написать вышеупомянутый фрагмент кода там, где я хочу, чтобы Form1 отображался, или лучше определить его один раз как статический метод в статическом классе, например так:

public static class globalvars
{
    public static void Form1Show()
    {
        Form1 frm = new Form1();
        frm.ShowDialog();
    }

}

А потом:

    private void btn1_Click(object sender, EventArgs e)
    {
        globalvars.Form1Show();
    }

Я думаю, что если объект формы создается при событии, когда мы хотим, чтобы форма отображалась (сначала нестатический подход), то выделяется памятьпоскольку этот процесс в стеке уничтожается сразу после его выполнения;в то время как при втором статическом подходе выделенная память остается в течение всего времени жизни приложения, и, следовательно, нестатический подход лучше, верно?

Я знаю, что оба работают, и не имеет большого значения, но все же, какова правильная практика кодирования, мудрое использование памяти?

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

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

public Form1 : Form
{
    public static void CreateNew()
    {
        using (var form = new Form1())
        {
            form.ShowDialog();
        }
    }

    [...]
}

EDIT: с точки зрения памяти, два предоставленных вами образца ведут себя точно так же. И модальные диалоги должны быть расположены явно (например, с использованием ключевого слова using).

1 голос
/ 06 мая 2011

Может быть, я что-то потерял там, но я не видел никакой разницы между ними. frm является локальной переменной, а не статическим полем .

0 голосов
/ 06 мая 2011

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

Все - я знаю, что это не совсем актуально, так как на вопрос был дан ответ, но чтобы ответить на вопрос nawfal относительно шаблона синглтона, я опубликую краткое описание и некоторый код здесь.

@ Nawfal - шаблон синглтона используется для обеспечения того, чтобы в приложении использовался только один экземпляр объекта. Существует огромное количество различных способов достижения этого, ознакомьтесь с базовым введением введение одноэлементного шаблона MSDN .

Для нетривиальных объектов, например, классы, это код, который я люблю использовать:

1: создать базовый класс Singleton

public abstract class SingletonBase<T> where T : class
{

    protected SingletonBase() { }
    public static T Instance
    {
        get { return SingletonFactory.Instance; }
    }

    /// <summary>
    /// The singleton class factory to create the singleton instance.
    /// </summary>
    class SingletonFactory
    {
        static SingletonFactory() { }
        SingletonFactory() { }
        internal static readonly T Instance = GetInstance();
        static T GetInstance()
        {
            var theType = typeof(T);
            T inst;
            try
            {
                inst = (T)theType
                  .InvokeMember(theType.Name,
                    BindingFlags.CreateInstance | BindingFlags.Instance
                    | BindingFlags.NonPublic,
                    null, null, null,
                    CultureInfo.InvariantCulture);
            }
            catch (MissingMethodException ex)
            {
                throw new TypeLoadException(string.Format(
                  CultureInfo.CurrentCulture,
                  "The type '{0}' must have a private constructor to " +
                  "be used in the Singleton pattern.", theType.FullName)
                  , ex);
            }

            return inst;
        }
    }

2: теперь наследуйте от вашего базового класса

public class myClass : SingletonBase<myClass>
{
    // this is a private constructor
   myClass() { }

   private void somemethod()
   {
   }

   public void SomeOtherMethod()
   {
   }
}

3: Наконец, везде, где вам нужно использовать myClass, вы вызываете его экземпляр, как показано ниже

class Program
{

    static void Main(string[] args)
    {
        // here you call the single instance of myClass
        myClass myClassInstance = myClass.Instance;

        // run the public someothermethod of myClass
        myClassInstance.SomeOtherMethod();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...