当前位置:编程学习 > C#/ASP.NET >>

new 与不new的区别

   
一段代码如下,为什么声明datatable变量的时候不用new? 而声明dataset、Sqlconnection等都需要用new呢?不是在.net中,申明引用类型的变量都要用new吗?(Datatable也是一个类啊,应该是属于引用类型变量的吧?)
 private void LoadAllNews()
    {
        AdoSql ReadAllNews=new AdoSql();//将AdoSql类实例化,定义一个对象ReadAllNews
        DataTable NewsTable = ReadAllNews.ReadAllNews();

        this.NewsGrid.DataSource=NewsTable;

        this.NewsGrid.DataBind();
    } --------------------编程问答-------------------- 像下面一段代码,   创建SqlCommand对象、 创建SqlDataAdapter 都用到了new.那为什么上面那段代码中,创建datatable对象的时候,没有使用new呢?他们有什么区别呢?
 public DataTable ExecuteSqlRead(string SqlString)      
        {
            SqlCommand SqlCmd = new SqlCommand();//定义一个命令对象
       
            SqlConnection myconn=new SqlConnection(ConfigurationSettings.AppSettings["ConnString"]);//创建数据连接对象
            SqlCmd.CommandText = SqlString;
           SqlDataAdapter SqlAd = new SqlDataAdapter(SqlString,myconn);//创建数据适配对象
            DataSet Rs = new DataSet();
            SqlAd.Fill(Rs); //填充数据适配对象
            return Rs.Tables[0]; //返回数据表
        } --------------------编程问答-------------------- 请高手帮忙解答啊~~~~~~~~ --------------------编程问答-------------------- new的话是生成一个新的对象, DataTable NewsTable = ReadAllNews.ReadAllNews(); 这是因为ReadAllNews.ReadAllNews()这个方法返回一个datatable类型的对象 --------------------编程问答-------------------- public DataTable ExecuteSqlRead(string SqlString)      
        { 
            SqlCommand SqlCmd = new SqlCommand();//定义一个命令对象 
      
            SqlConnection myconn=new SqlConnection(ConfigurationSettings.AppSettings["ConnString"]);//创建数据连接对象 
            SqlCmd.CommandText = SqlString; 
          SqlDataAdapter SqlAd = new SqlDataAdapter(SqlString,myconn);//创建数据适配对象 
            DataSet Rs = new DataSet(); 
            SqlAd.Fill(Rs); //填充数据适配对象 
            return Rs.Tables[0]; //返回数据表 
        }
上面这个方法的返回值是一个DATATABLE,它是一个引用,传回来的也是一个引用,也就是一个DataTable的实例对象,所以接收它的  DataTable NewsTable = ReadAllNews.ReadAllNews(); 
这里的NewsTable 就是指向上述方法返回的那个DataTable.已经引用到一个实例对象了,所以它不会是Null,没有必要先New一个出来.

你可以这样测试一下:
方法里:
  SqlAd.Fill(Rs); //填充数据适配对象 
Rs.Tables[0].TableName="returnDataTable";添加这句
            return Rs.Tables[0]; //返回数据表 

调用的位置:
  AdoSql ReadAllNews=new AdoSql();//将AdoSql类实例化,定义一个对象ReadAllNews 

        DataTable NewsTable = ReadAllNews.ReadAllNews(); 改成:

 DataTable NewsTable =new DataTable("myNewDataTable");
NewsTable = ReadAllNews.ReadAllNews(); 

MessageBox.Show(NewsTable.TableName);你看一下它显示出来的表名是"returnDataTable",而不是"myNewDataTable",你就应该明白,引用的是方法所返回的表.

本来想画个图的,那样比较直观,不过论坛里不知道怎么贴图.

--------------------编程问答-------------------- 和给分与不分有关 --------------------编程问答-------------------- 谢谢各位高手的回答。明白了一些!还需要仔细研究一下。 --------------------编程问答-------------------- 你自己要造一辆汽车,还是从别人那里买一辆汽车的区别。
--------------------编程问答-------------------- 你给分,就可以new一辆新车,不给,就只能从别人那得到一辆二手的 --------------------编程问答-------------------- 是否生成新实例 --------------------编程问答-------------------- 用new 是创建一个实例,用于不是静态类中。 --------------------编程问答-------------------- 呵呵。
例如:O o = new O();你吃的饭是你自己做的。
而 O o = factory.createO();这饭是别人做给你吃的。
不管怎么着你都不会饿着。 --------------------编程问答-------------------- 旁听,谢谢 --------------------编程问答-------------------- 学习! --------------------编程问答-------------------- 楼上的经典回答太精彩啦。
就让我这个后生封一下楼吧!!
OK --------------------编程问答-------------------- 顶  就是新车与二手车的区别 --------------------编程问答-------------------- 哈哈,咱们C#里面的想法还真多啊,哈哈,要是我讲就没有能怎么生动.... --------------------编程问答-------------------- 路过 --------------------编程问答-------------------- 呵呵  这个还真得搞懂了  要不以后麻烦。。。。 --------------------编程问答--------------------
引用 11 楼 zsc305054170 的回复:
呵呵。
例如:O o = new O();你吃的饭是你自己做的。
而 O o = factory.createO();这饭是别人做给你吃的。
不管怎么着你都不会饿着。

这个回复很贴切 --------------------编程问答-------------------- new是创建一个新的实例对象。 --------------------编程问答-------------------- datatable dt;//声明一个dt 没有实例化。只占4个字节
dt=new datatable() ;//实例化一个datatable ,会调用datatable的构造函数
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,