2016-07-03 2 views
0

Я немного смущен о вызове рекурсивного метода от себя. Вот пример кода:Использование рекурсии в нестационарном методе - C#

class Program 
{ 
public static void main(String args[]) 
{ 
    Program p = new Program(); 
    p.Foo(); 
    } 

    Public ... Foo() 
    { 
    Foo(); 
    } 

мне нужно создать новый экземпляр программы для вызова Foo из Foo ли? Мой код работает без экземпляра, но я не уверен, правильно ли он.

Благодаря

+1

Нет, вам не нужно создавать другой экземпляр. метод 'Foo' работает в контексте вашего текущего экземпляра, поэтому, естественно, когда вы вызываете' Foo' изнутри, вам не нужно указывать экземпляр. –

ответ

1

Вам не нужно, чтобы сделать новый экземпляр Program, но onlu вас объявить метод Foo в static. Если вы сохраните его как есть, вам нужно будет создать новый экземпляр Program, который я предлагаю вам не делать, потому что не очень хорошая практика иметь класс, который создает себя в статическом методе, только для вызова нестатического метод. Вы должны иметь:

class Program 
{ 
public static void main(String args[]) 
{ 
    Foo(); //direct call to Foo 
} 

    public static ... Foo() 
    { 
    Foo(); 
    } 
} 
+0

В конечном итоге этот код не будет работать. –

+0

@SushilMate, почему вы так говорите? – meJustAndrew

+0

попробуйте запустить его :) –

0

Нет, вам не нужно создавать новый класс. Вот пример (unittest).

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Collections.Generic; 

namespace UnitTestProject 
{ 
    [TestClass] 
    public class UnitTest 
    { 
     public class Factorial 
     { 
      Dictionary<int, long> store = new Dictionary<int, long>(); 

      public long Get(int number) 
      { 
       if (store.ContainsKey(number)) 
       { 
        return store[number]; 
       } 

       if (number == 0) 
       { 
        store.Add(0, 1); 
        return 1; 
       } 

       var result = number * Get(number - 1); 
       store.Add(number, result); 

       return result; 
      } 
     } 


     [TestMethod] 
     public void SomeTest() 
     { 
      // Arrange 
      var target = new Factorial(); 
      var results = new List<long>(); 

      // Act 
      for (int i = 10; i >= 0; i--) 
      { 
       results.Add(target.Get(i)); 
      } 

      // Assert 
     } 
    } 
} 
Смежные вопросы