Вызов функции безымянного объекта в операторе using - PullRequest
0 голосов
/ 27 октября 2018

Пытается выучить using утверждение. Как вызвать add функцию вновь созданного безымянного объекта в функции tst():

public class AnswerCmd : IDisposable
{

    public static void tst()
    {
        using (new AnswerCmd())
        {
            //add(5); not works
        }

    }



    public void add(int value)
    {
        //....
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

}

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Поскольку функция tst является статической функцией, а функция add - нет.

Если вы хотите создать экземпляр, попробуйте удалить static

public class AnswerCmd : IDisposable
{

    public void add(int value)
    {

    }

    public void Dispose()
    {

    }

}

тогда вы можете использовать это снаружи

using (var ans = new AnswerCmd())
{
    ans.add(5);
}

Примечание

удалить throw new NotImplementedException(); в функции Dispose, в противном случае вы получите ошибку при выходе из using.

0 голосов
/ 27 октября 2018

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

public class AnswerCmd : IDisposable
{
    public static void tst()
    {
        using (AnswerCmd var = new AnswerCmd())
        {
            var.add(5);
        }
    }

    public void add(int value)
    {
        Console.WriteLine($"Add: {value}");
    }

    public void Dispose()
    {
        //throw new NotImplementedException();
    }
}

Вы должны объявить переменную AnswerCmd var в вашем операторе using в типе вашего класса, а затем после создания и присваивания и возражать против него следующим образом AnswerCmd var = new AnswerCmd()вызовите ваш add метод, подобный этому var.add().

Если вы хотите узнать больше об этом и почему вы должны это сделать, я должен сказать, что это потому, что ваш tst метод static и ваш add метод нестатическая .Нестатические методы предназначены только для объектов вашего класса, и вы не можете вызывать их, если не создали объект из этого класса.Когда вы вызываете нестатический метод напрямую, не создавая объект, это синтаксическая ошибка.

Вы также должны удалить или прокомментировать throw new NotImplementedException(); в Dispose методе, потому что ваш метод будет выбрасывать и Exception приВы оставляете использование.

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

0 голосов
/ 27 октября 2018

Поскольку add не является статическим , вам необходимо создать новый экземпляр AnswerCmd для доступа к нему, например:

using (var instance = new AnswerCmd())
{
    instance.add(5);
}
...