如何防止静态方法创建空对象

时间:2017-08-28 19:54:06

标签: c# oop methods constructor

我有一个静态方法,我调用它来检查是否应该添加一个对象,如果它应该添加它,则调用构造函数。如果不是,它应该什么都不做。我认为返回null会实现这一点,但它创建的对象没有填充任何属性。这会在稍后导致运行时错误。

这是我的代码:

public static WorkSheets AddSheet(string dataPath, string exportFile, string finalFile, string tabName)
{
    if (File.Exists(dataPath + exportFile))
    {
        if (!tabName.Contains("Forecast") & !tabName.Contains("Sales"))
            if (Functions.FileIsGood(dataPath + exportFile)) File.Copy(dataPath + exportFile, dataPath + finalFile, true);

        return new WorkSheets(dataPath, exportFile, finalFile, tabName);
    }
    return null;
}

和我的构造函数:

public WorkSheets(string dataPath, string exportFile, string finalFile, string tabName)
{
     this.ExportFile = dataPath + exportFile;
     this.Path = dataPath + finalFile;
     this.TabName = tabName;
     this.DateError = !Functions.IsTodaysDate(ExportFile);
     this.WorksheetDate = File.GetLastWriteTime(ExportFile);
     this.SizeError = !Functions.IsCorrectSize(ExportFile);
     this.WorksheetSize = new FileInfo(ExportFile).Length;

}

然后我调用这样的方法:

worksheets.Add(WorkSheets.AddSheet(CurrentWorkbook.DataPath, Constants.PipeExport, Constants.PipeFinalFile, "Pipe"));

我遇到的问题是返回null;我能做什么,所以它不会添加空对象。

4 个答案:

答案 0 :(得分:1)

您只需要从临时变量中获取 AddSheet 的返回值,并检查它是否为空。
如果为null,则不要将其添加到工作表列表中

WorkSheets sheet = WorkSheets.AddSheet(CurrentWorkbook.DataPath, 
                       Constants.PipeExport, 
                       Constants.PipeFinalFile, 
                       "Pipe")); 
if(sheet != null) 
    worksheets.Add(sheet); 

如果您希望每次向列表中添加元素时都避免重复此检查,那么您可以创建一个派生自List<T>的新类,并编写自己的Add方法来执行null检查并添加到如果要添加的元素不为null,则为基础类。

public class ListWorkSheets : List<WorkSheets>
{
    public new void Add(WorkSheets source)
    {
        if(source != null)
            base.Add(source);
    }
}

现在您可以声明

ListWorkSheets worksheets = new ListWorkSheets();

并使用您当前的语法而不向列表中添加null

worksheets.Add(WorkSheets.AddSheet(CurrentWorkbook.DataPath, 
                                   Constants.PipeExport, 
                                   Constants.PipeFinalFile, 
                                   "Pipe")); 

答案 1 :(得分:0)

在将实例添加到列表之前尝试一些条件逻辑。

IE

export class MyButtons extends React.Component {
    constructor(props) {
        super(props);

        this.state = { selectedIndex: 0 };

        this.handleClick = this.handleClick.bind(this);
    }

    handleClick(newIndex) {
        this.setState({
            selectedIndex: newIndex
        });
    }

    render() {
        return (
            <div>
                <button onClick={this.handleClick(0)} >Button 0</button>
                <button onClick={this.handleClick(1)} >Button 1</button>
                <span>{this.state.selectedIndex}</span>
            </div>
        );
    }
}

答案 2 :(得分:0)

如果您的方法具有声明的返回类型,则必须返回该类型或null。

您可以抛出异常。

或者您将返回类型更改为void并为结果声明out参数

或者,您可以保存实例化对象的调用结果并检查是否为空。

var tmp =  WorkSheets.AddSheet(foo);
if(tmp != null) {
  worksheets.Add(tmp)
}

答案 3 :(得分:0)

我推荐以下其中一项:

  1. @Steve说:分开你的函数调用并在返回时检查null。
  2. 将您的函数调用包装在try / catch块中,然后让函数返回异常,如果它找不到该文件。
  3. 如果它是一个罕见的异常情况,无法找到文件,那么异常可能是正确的&#39;从方法论的角度来看。如果尝试使用不正确的路径很常见,那么返回null并像Steve所说的那样检查可能是最好的。这是代码方法问题而不是技术要求。