Вызов основного конструктора в C# [дубликат]

Вы можете написать следующий код:

string url = currentURL + "resources/" + ResourceID + "/accounts?AUTHTOKEN=" + pmtoken;

using (HttpClient client = new HttpClient())
{
     using (HttpResponseMessage response = client.GetAsync(url).Result)
     {
          using (HttpContent content = response.Content)
          {
              var json = content.ReadAsStringAsync().Result;
          }
     }
}

Обновить 1:

, если вы хотите заменить вызов на Result с помощью ключевого слова await, тогда это возможно, но вы должны поместить этот код в метод, который помечается как async как следующий

public async Task AsyncMethod()
{
    string url = currentURL + "resources/" + ResourceID + "/accounts?AUTHTOKEN=" + pmtoken;

    using (HttpClient client = new HttpClient())
    {
        using (HttpResponseMessage response = await client.GetAsync(url))
        {
             using (HttpContent content = response.Content)
             {
                var json = await content.ReadAsStringAsync();
             }
        }
     }
}

, если вы пропустили ключевое слово async из метода, вы можете получить время компиляции как следующий

Оператор «ожидание» может использоваться только в асинхронном методе. Рассмотрим маркировку этого метода с помощью модификатора «async» и изменив его тип возврата на «Задача».

blockquote>

Обновление 2:

Отвечая на ваш первоначальный вопрос о преобразовании ' WebClient 'to' WebRequest '- это код, который вы могли бы использовать ... Но Microsoft (и я) рекомендовал вам использовать первый подход (используя HttpClient).

string url = currentURL + "resources/" + ResourceID + "/accounts?AUTHTOKEN=" + pmtoken;

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "GET";

using (WebResponse response = httpWebRequest.GetResponse())
{
     HttpWebResponse httpResponse = response as HttpWebResponse;
     using (StreamReader reader = new StreamReader(httpResponse.GetResponseStream()))
     {
         var json = reader.ReadToEnd();
     }
}

Обновление 3

Чтобы узнать, почему HttpClient более рекомендуется, чем WebRequest и WebClient, вы можете обратиться к следующим ссылкам.

Нужна помощь в решении между HttpClient и WebClient

http://www.diogonunes.com/blog/webclient-vs-httpclient-vs-httpwebrequest/ ]

HttpClient vs HttpWebRequest

Какая разница между классами WebClient и HTTPWebRequest в .NET?

http://blogs.msdn.com/b/henrikn/archive/2012/02/11/httpclient-is-here.aspx

19
задан DotnetDude 9 March 2009 в 15:42
поделиться

7 ответов

Необходимо вызвать конструктора базового класса до тела конструктора производного класса.

class Derived : Base
{
  public Derived(string someParams)
    : base("Blah " + someParams)
  {

  }

}
19
ответ дан 30 November 2019 в 03:25
поделиться

Вы не можете. Можно назвать его прежде:

public Derived() : base()

или необходимо использовать рычаг

class Base
{
  protected void init() { }
  public Base(string sMessage)
  {
     init();
  }
}

class Derived : Base
{
  public Derived(string someParams)
  {
   string sMessage = "Blah " + someParams;
   init();
  }
}
8
ответ дан 30 November 2019 в 03:25
поделиться

Точки, которые будут отмечены на конструкторах:

В · Конструкторы не могут быть "виртуальными".

В · Они не могут быть наследованы.

В · Конструкторов вызывают в порядке наследования.

public Child(string a):base(a){}
1
ответ дан 30 November 2019 в 03:25
поделиться

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

public class Base
{

    public Base() : this(true) { }

    protected Base(bool runInitializer)
    {
        if (runInitializer)
        {
            this.Initialize();
        }
    }

    protected void Initialize()
    {
        ...initialize...
    }
}

public class Derived : Base
{
    // explicitly referencing the base constructor keeps
    // the default one from being invoked.
    public Derived() : base(false)
    {
       ...derived code
       this.Initialize();
    }
}
4
ответ дан 30 November 2019 в 03:25
поделиться
public Derived(string someParams) : base(someParams)
{
    string sMessage = "Blah " + someParams;
}

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

class Base
{
  public Base(string sMessage)
  {
     ConstructorStuff();
  }

  protected Base()
  {
  }

  protected void ConstructorStuff()
  {
  }
}

class Derived : Base
{
  public Derived(string someParams)
  {    
   string sMessage = "Blah " + someParams;

   ConstructorStuff();       
  }    
}
0
ответ дан 30 November 2019 в 03:25
поделиться

На самом деле простое решение:

class Base
{
  public Base(string sMessage)
  {
     //Do stuff
  }
}

class Derived : Base
{
  public Derived(string someParams)
    : base("Blah " + someParams)
  {
  }

}

, Почему делают это более сложным?

0
ответ дан 30 November 2019 в 03:25
поделиться

Изначально я пропустил комментарий OregonGhost об использовании статического метода для изменения параметра, который оказался для меня наиболее полезным, поэтому я решил добавить образец кода для тех, кто читает эта ветка:

class Base
{
    public Base( string sMessage )
    {
        // Do stuff
    }
}

class Derived : Base
{
    public Derived( string sMessage ) : base( AdjustParams( sMessage ) )
    {
    }

    static string AdjustParams( string sMessage )
    {
        return "Blah " + sMessage;
    }
}
7
ответ дан 30 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: