【问题标题】:Initialize of a Class as variable in c#在c#中将一个类初始化为变量
【发布时间】:2016-10-05 10:48:46
【问题描述】:

我无法理解这段代码。为什么我需要将一个类初始化为变量,例如“private InvoiceMaster _invoiceMaster”和“InvoiceMaster im = new InvoiceMaster()”。请详细帮助我。我需要非常清楚地理解。

  namespace AHS.Invoice.UI
 {
  public partial class ReRouteDetail : BasePage
  {
    #region Declaration
    private InvoiceMaster _invoiceMaster;
    DataSet _ds = new DataSet();
    InvoiceMasterCollection _invoiceMasterCollection = new InvoiceMasterCollection();

    #endregion

    #region Page Events
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        if (!IsPostBack)
        {

        }
        this.LoadColumns();
        this.LoadGridData();
    }
    #endregion  

    #region Methods


    private void LoadGridData()
    {

        if (base.CurrentScreen.ID == 3780)
        {
            _ds = new InvoiceMasterCollection().LoadReRouteData();
            gc.GridDataSource = _ds;
            gc.GridDataBind();
        }
        else if (base.CurrentScreen.ID == 3781)
        {
            _ds = new InvoiceMasterCollection().LoadReRouteFromServiceApproverData();
            gc.GridDataSource = _ds;
            gc.GridDataBind();
        }
        else if (base.CurrentScreen.ID == 3782)
        {
            _ds = new InvoiceMasterCollection().LoadReRouteFromServiceConfirmationData();
            gc.GridDataSource = _ds;
            gc.GridDataBind();
        }
    }

    #endregion


    #region Events
    protected void gc_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {

                DropDownList ddlStatus = e.Row.Cells[7].FindControl("ddlStatus") as DropDownList;
                ddlStatus.CssClass = "ReRouteddlStatus";
                if (base.CurrentScreen.ID == 3780)
                {
                    DataSet reRouteDataSet = new InvoiceMasterCollection().LoadStatus(Convert.ToInt32(e.Row.Cells[4].Text));
                    ddlStatus.DataTextField = "Description";
                    ddlStatus.DataValueField = "ID";
                    ddlStatus.DataSource = reRouteDataSet;
                    ddlStatus.DataBind();
                }

                if (base.CurrentScreen.ID == 3781 || base.CurrentScreen.ID == 3782)
                {
                    ddlStatus.Enabled = false;                    
                }
            System.Web.UI.WebControls.Button btnReRoute = e.Row.Cells[8].FindControl("btnReRoute") as System.Web.UI.WebControls.Button;
            btnReRoute.CssClass = "btnBackToReRoute";
            //Button btnReRoute = e.Row.Cells[8].FindControl("btnReRoute") as Button;
            btnReRoute.CommandName = "ReRoute";
            btnReRoute.CommandArgument = e.Row.Cells[0].Text;
            e.Row.Cells[8].Controls.Add(btnReRoute);

        }
    }

    protected void gc_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "ReRoute")
        {
              int masterID = Convert.ToInt32(e.CommandArgument);

              Button button = null;
              foreach (GridViewRow rows in gc.GridRows)
              {
                  InvoiceMaster im = new InvoiceMaster();
                  im.ID = masterID;
                 // this.LoadGridData();

                  _invoiceMaster = new InvoiceMaster();
                  _invoiceMaster = im.GetData();

                  int id = Convert.ToInt32(rows.Cells[0].Text);
                  if (id == masterID)
                  {
                      button = rows.FindControl("btnReRoute") as Button;

   DropDownList ddlStatus(DropDownList)rows.Cells[6].FindControl("ddlStatus");
            if (base.CurrentScreen.ID == 3780)
                      {
                          _invoiceMaster.StatusID = Convert.ToInt32(ddlStatus.SelectedItem.Value);
                      }
                      if (base.CurrentScreen.ID == 3781)
                      {
                          _invoiceMaster.StatusID = 13;
                      }
                      if (base.CurrentScreen.ID == 3782)
                      {
                          _invoiceMaster.StatusID = 11;
                      }
                      _invoiceMaster.Save();

                      break;
                  }                     
              }

            LoadColumns();
            LoadGridData();
            base.ShowClientMessage("Invoice Backed Successfully.");
        }
    }

    #endregion
}

}

【问题讨论】:

  • 该代码目前无法编译,因为您在类级别有语句,其中应该只有声明。如果您不知道为什么它无效,那将是一个有用的问题。如果这不是实际上您感兴趣的代码,请提供minimal reproducible example

标签: c# class variables


【解决方案1】:

当你写下这一行时:

private InvoiceMaster _invoiceMaster;

您只是定义了InvoiceMaster 类型的类的私有成员。然而,此时引用没有指向任何内容(“值”是null)。

在这一行:

InvoiceMaster im = new InvoiceMaster();

您还创建了该类的一个私有成员(c# 中的默认值是private),这一次您正在为该引用分配一个您正在创建的新对象。

以下行不会编译,必须在函数范围内:

im.ID = masterID;

_invoiceMaster = new InvoiceMaster();
_invoiceMaster = im.GetData();

我建议您阅读众多教程之一,以更好地了解数据类型、变量和范围

【讨论】:

  • 是的。我在一个函数中得到这个代码。但是我并不清楚这些“private InvoiceMaster _invoiceMaster”和“InvoiceMaster im = new InvoiceMaster()”这两行。你的回答对我来说很清楚。但是如果 Use.InvoiceMaster im = new InvoiceMaster(); im.ID = masterID; im.GetData();它显示为空。但是当我使用 _invoiceMaster = new InvoiceMaster(); _invoiceMaster = im.GetData();它;显示记录。为什么?
  • @user3510330 - 请编辑您的问题并显示更完整的代码版本
  • 我添加了完整版本的代码。请帮助理解。
  • @user3510330 - 问题到底出在哪里?.. 代码行
  • 这里没有错误。但是如果两个声明都是类的私有成员。为什么我需要创建“InvoiceMaster im = new InvoiceMaster()”来分配对象。为什么不是 _invoiceMaster.ID = masterID 而不是 im.ID = masterID;。我试过这段代码,但它显示空异常。
猜你喜欢
  • 2014-04-13
  • 2015-04-22
  • 2011-01-04
  • 1970-01-01
  • 2022-06-11
  • 2010-11-18
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多