c# имеет эквивалент интерфейса Java Runnable?
Если не, как это могло быть реализовано или это просто не нужно?
спасибо.
Нет. C # обрабатывает потоки иначе, чем Java. Вместо того, чтобы создавать подклассы класса Thread, вы просто создаете новый объект System.Threading.Thread и передаете ему делегат ThreadStart (это функция, в которой вы выполняете работу).
Имеется ли в C # эквивалент интерфейса Java Runnable?
Да, это ThreadStart
class Runner
{
void SomeMethod()
{
Thread newThread = new Thread(new ThreadStart(Run));
newThread.Start();
}
public void Run()
{
Console.WriteLine("Running in a different thread.")
}
}
Будет эквивалентно следующему коду Java
class Runner implements Runnable {
void someMethod() {
Thread newThread = new Thread( this );
newThread.start();
}
public void run() {
out.println("Running in a different thread.");
}
}
Делегат ThreadStart
по существу совпадает с интерфейсом Runnable
. Делегат похож на интерфейс для отдельного метода, а не для всего класса, поэтому на самом деле его проще реализовать, чем интерфейс Runnable
в Java.
MSDN объясняет о делегатах :
Делегаты и интерфейсы похожи в том, что они позволяют разделить спецификация и реализация. Несколько независимых авторов могут производить реализации, которые совместим с интерфейсом Спецификация. Точно так же делегат указывает подпись метода, и авторы могут писать методы, которые совместим с делегатом Спецификация. Когда следует использовать интерфейсы, и когда следует использовать делегаты?
Делегаты полезны, когда:
- Вызывается единственный метод.
- Класс может захотеть иметь несколько реализаций метода спецификации.
- Желательно разрешить использование статического метода для реализации спецификации.
- Желателен шаблон проектирования, подобный событию (для получения дополнительной информации см. Учебное пособие по событиям).
- Вызывающему не нужно знать или получать объект, который метод определено на.
- Поставщик реализации хочет "раздать" реализация спецификации только несколько выбранных компонентов.
- Желательна простая композиция.
Интерфейсы полезны, когда:
- Спецификация определяет набор связанных методов, которые будут вызывается.
- Класс обычно реализует спецификацию только один раз.
- Вызывающий интерфейс хочет выполнить приведение к интерфейсу или от него. введите для получения других интерфейсов или классы.
C #
использует делегат ThreadStart
вместо стиля Java Runnable
.
public class Foo
{
public void DoStuff()
{
while (true)
{
// do some stuff
}
}
};
public class Bar
{
public static int Main()
{
Foo foo = new Foo();
// create a ThreadStart delegate and pass in the method that will run
// (similar to run on Java's Runnable)
Thread thread = new Thread(new ThreadStart(foo.DoStuff));
thread.Start();
}
}
Это не нужно - потоки в C # берут экземпляр делегата ThreadStart
или ParameterizedThreadStart
, которые являются исполняемыми компонентами потока для выполнения.
Самым близким к высокоуровневому API-интерфейсу, ориентированному на задачи, является BackgroundWorker
. Как уже упоминалось, .NET (и, следовательно, C #) используют делегаты для представления вызываемого метода. В Java нет такой концепции (указатели на функции), и вместо этого используются интерфейсы для вызываемых объектов.
.Net использует делегатов ThreadStart
и ParameterizedThreadStart
для начальной загрузки потоков.
Делегаты, являющиеся первоклассными гражданами в .Net, вы можете оставить ссылка вокруг, если вам нужно.