2015-08-13 2 views
0

Я собрал это, чтобы проанализировать строку, а затем вернуть 3 значения в хранимой процедуре SQL (у меня есть другой метод C#, который форматирует 3 значения на основе выбранного формата вывода, но с этим кодом нет проблем, поэтому я не публиковал его). Когда мой босс увидел мой код, он это сказал:метод нестатического класса - C#

«Как у вас есть метод нестатического класса фабричного Вам нужно создать объект для разбора строки для создания объекта для использования

?

Зачем переместить синтаксический анализ в класс вместо того, чтобы оставить его там, где он был , и просто передать новый класс для хранения данных? "

Я сделал новый класс, но могу легко переместить его в другой. Проблема в том, что Я не знаю, что он подразумевает по нестационарному методу фабрики, а также я не знаю, как назначить значение, фракцию и направление, не создавая новый экземпляр TwpRng, как я сделал: TwpRng result = new TwpRng();

Это моя первая трещина в C# BTW.

public class TwpRng 
{ 
public string Value; 
public string Fraction; 
public string Direction; 


public TwpRng GetValues(string input) 
{ 
    TwpRng result = new TwpRng(); 
    result.Value = ""; 
    result.Fraction = ""; 
    result.Direction = ""; 

    Regex pattern_1 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<frac>[AU])(?<dir>[NEWS])\s*$"); // Example: 0255N 
    Match match_1 = pattern_1.Match(input); 

    Regex pattern_2 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<dir>[NEWS])\s*$"); // Example: 25N 
    Match match_2 = pattern_1.Match(input); 

    Regex pattern_3 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<frac>[AU])\s*$"); // Example: 25A 
    Match match_3 = pattern_1.Match(input); 

    if (match_1.Success) 
    { 
     result.Value = match_1.Groups["val"].Value; 
     result.Fraction = match_1.Groups["frac"].Value; 
     result.Direction = match_1.Groups["dir"].Value.ToUpper();    
    } 
    else if (match_2.Success) 
    { 
     result.Value = match_2.Groups["val"].Value; 
     result.Direction = match_2.Groups["dir"].Value.ToUpper(); 
    } 
    else if (match_3.Success) 
    { 
     result.Value = match_3.Groups["val"].Value; 
     result.Fraction = match_1.Groups["frac"].Value; 
    } 
    else 
    { 
     result = null; 
    } 
    return result; 
} 

}

ответ

0

Если вы меняете:

public TwpRng GetValues(string input) 

к:

public static TwpRng GetValues(string input) 

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

TwpRng myRng = new TwpRng(); 
TwpRng createdRng = myRng.GetValues(input); 

в противоположность:

TwpRng createdRng = TwpRng.GetValues(input); 

Остальная часть кода может быть то же самое.

Expanded Объяснение

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

1

Как у вас есть метод нестатического класса? Вам нужно создать объект для синтаксического анализа строки для создания объекта для использования?

Что он имел в виду, что в том, что в настоящее время для того, чтобы разобрать вход, вы должны были бы сделать это:

var twpRng = new TwpRng(); // Doesn't really make sense to instantiate an empty object 
twpRng = twpRng.GetValues(input); // just to create another one. 

Если вы сделали свой фабричный метод GetValuesstatic:

public static TwpRng GetValues(string input) 

Вы можете разбираться проще:

var twpRng = TwpRng.GetValues(input); 
+0

Спасибо, я попробую это. Это имело для меня общий смысл, я просто не понимал, как реализовать это на практике с точки зрения синтаксиса. – chriscmu

+0

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