Я следую соглашению, что я не буду использовать никаких операторов печати в классах, но я проверил валидацию параметра в конструкторе. Скажите, пожалуйста, как вернуть эту проверку, которую я сделал в конструкторе, к главной функции.
Как вернуть значение с помощью конструктора в С#?
Ответ 1
Конструктор возвращает значение - строящийся тип...
Конструктор не должен возвращать какой-либо другой тип значения.
Когда вы проверяете конструктор, вы должны бросать исключения, если недопустимые значения переданы.
public class MyType
{
public MyType(int toValidate)
{
if (toValidate < 0)
{
throw new ArgumentException("toValidate should be positive!");
}
}
}
Ответ 2
Конструкторы не имеют типа возврата, но вы можете передавать значения по ссылке с помощью ключевого слова ref
. Было бы лучше сделать исключение из конструктора, чтобы указать на ошибку проверки.
public class YourClass
{
public YourClass(ref string msg)
{
msg = "your message";
}
}
public void CallingMethod()
{
string msg = string.Empty;
YourClass c = new YourClass(ref msg);
}
Ответ 3
Сделайте конструктор с параметром Out и отправьте свое возвращаемое значение через него.
public class ClassA
{
public ClassA(out bool success)
{
success = true;
}
}
Ответ 4
Когда конструктор получает недопустимый аргумент, он обычно генерирует исключение. Затем вы можете поймать это исключение и проанализировать содержащиеся в нем данные.
try
{
int input = -1;
var myClass = new MyClass(input);
}
catch (ArgumentException ex)
{
// Validation failed.
}
Ответ 5
Конструктор возвращает создаваемый тип и, при необходимости, может вызывать исключение. Возможно, лучшим решением было бы добавить статический метод, чтобы попытаться создать экземпляр вашего класса:
public static bool TryCreatingMyClass(out MyClass result, out string message)
{
// Set the value of result and message, return true if success, false if failure
}
Ответ 6
Я думаю, что мой подход также может быть полезным. Необходимо добавить открытое свойство в конструктор, тогда вы можете получить доступ к этому свойству из другого класса, как показано в примере ниже.
// constructor
public class DoSomeStuffForm : Form
{
private int _value;
public DoSomeStuffForm
{
InitializeComponent();
// do some calculations
int calcResult = 60;
_value = calcResult;
}
// add public property
public int ValueToReturn
{
get
{
return _value;
}
}
}
// call constructor from other class
public statc void ShowDoSomeStuffForm()
{
int resultFromConstructor;
DoSomeStuffForm newForm = new DoSomeStuffForm()
newForm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
newForm.ShowDialog();
// now you can access value from constructor
resultFromConstructor = newForm.ValueToReturn;
newForm.Dispose();
}