社区
C#
帖子详情
请问c#中能得到一个对象的引用数吗?
blacken1008
2009-12-02 04:43:03
我想得到一个对象被引用的计数,在c#中能实现吗??
...全文
408
13
打赏
收藏
请问c#中能得到一个对象的引用数吗?
我想得到一个对象被引用的计数,在c#中能实现吗??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
heguodong
2009-12-02
打赏
举报
回复
看看GC命名空间里有没有相关的帮助吧
blacken1008
2009-12-02
打赏
举报
回复
只有垃圾回收器知道。。。呵呵
heguodong
2009-12-02
打赏
举报
回复
C#的对象没有引用数一说,只有CLR垃圾回收器知道
public class YourClass()
{
protected static objCount;
public Yourclass()
{
objCount++;
}
}
这个做法是不可能的,你这是统计总共生成了多少个该类型的对象,没办法知道对象级别的引用记数,和C++的哪个引用记数不是一会事情,而且C++的引用记数也不是这样子的
是对象本身维护一个int数字,不是类维护的,类要重写等于,拷贝构造等几个方法
tianrui456
2009-12-02
打赏
举报
回复
给类写个static字段int型的 在类的构造函数中让这个值自增,在他的析构函数中自减 就可以了(这好像是原来上学时候C++的一道作业题) 呵呵
会飞的老鱼
2009-12-02
打赏
举报
回复
来学习下
shighui
2009-12-02
打赏
举报
回复
我估计是不好实现的。因为引用一个对象的意思也就是用该对象的内存地址。这个东西不好确定到底用了多少次。怕是实现不了。
shighui
2009-12-02
打赏
举报
回复
不好意思,理解错误!
shighui
2009-12-02
打赏
举报
回复
public class YourClass()
{
protected static objCount;
public Yourclass()
{
objCount++;
}
}
即定义一个类级变量,每新创建一个对象该变量自增。
liherun
2009-12-02
打赏
举报
回复
应该能知道的,不确定
blacken1008
2009-12-02
打赏
举报
回复
这不是我想要的
我想要的是 是否.net framework里有这组件 通过一个方法获得~
zhaowanru19
2009-12-02
打赏
举报
回复
或者?Application?
zhukui
2009-12-02
打赏
举报
回复
不能
zhaowanru19
2009-12-02
打赏
举报
回复
设置个全局静态变量。。然后每次调用都++。。。不知道可以不可以。楼主测试。。
C#
通讯录有源码文件
刚写的通讯录有兴趣的可以看看,有源码文件 看这个通讯录需要学习的几个知识点: 1.字典(重点:字典
中能
用到的方法,字典中键值存放的类型比如:键必须唯一,值可以存放变量或者是
对象
,需要特别重视值是
对象
的时候) 2.list
3.ref out相关的 4.string类型的方法(类似trim,toUpper等) 5.
引用
类型和值类型的区别 6.静态类的使用 7.
数
据类型的转换 8.foreach遍历 9.熟悉类和
对象
整体设计模式是依照MVC,代码的分区比较清晰,逻辑比较清晰,代码中注释也比较清晰 大概就介绍这么多,其他没介绍到的,自己遇到不会可以上网查,可能会有点小小的bug但是不影响
.net
数
据访问类 SQL Helper 类
.net
数
据访问类 SQL Helper 介绍 摘要:Data Access Application Block 是
一个
.NET 组件,包含优化的
数
据访问代码,可以帮助用户调用存储过程以及向 SQL Server
数
据库发出 SQL 文本命令。它返回 SqlDataReader、DataSet 和 XmlReader
对象
。您可以在自己的 .NET 应用程序中将其作为构造块来使用,以减少需要创建、测试和维护的自定义代码的
数
量。您可以下载完整的
C#
和 Visual Basic .NET 源代码以及综合文档。 简介 您是否正在从事 .NET 应用程序
数
据访问代码的设计和开发?您是否觉得自己总是在反复编写相同的
数
据访问代码?您是否曾经将
数
据访问代码包装在 Helper 函
数
中,以便能够在一行中调用存储过程?如果是,那么 Microsoft? Data Access Application Block for .NET 正是为您设计的。 Data Access Application Block 将访问 Microsoft SQL Server?
数
据库的性能和资源管理方面的最佳经验封装在一起。您可以很方便地在自己的 .NET 应用程序中将其作为构造块使用,从页减少了需要创建、测试和维护的自定义代码的
数
量。 尤其是,Data Access Application Block 可以帮助您: 调用存储过程或 SQL 文本命令。 指定参
数
详细信息。 返回 SqlDataReader、DataSet 或 XmlReader
对象
。 例如,在
引用
了 Data Access Application Block 的应用程序中,您可以简单地在一行代码中调用存储过程并生成 DataSet,如下所示: [
C#
] DataSet ds = SqlHelper.ExecuteDataset( connectionString, CommandType.StoredProcedure, "getProductsByCategory", new SqlParameter("@CategoryID", categoryID)); 注意: Application Block for .NET(用于 .NET 的应用程序块)是基于对成功的 .NET 应用程序进行详细研究而设计的。它以源代码的形式提供,您可以原样使用,也可以针对自己的应用程序进行自定义。该应用程序块并不代表未来 Microsoft ADO.NET 程序库的发展方向。Microsoft ADO.NET 程序库是为在各种使用情况下实现对
数
据访问行为的精确控制而建立的。将来的 ADO.NET 版本可能会使用不同的模型来实现这个方案 SqlHelper 类提供了一组静态方法,可以用来向 SQL Server
数
据库发出许多各种不同类型的命令。 SqlHelperParameterCache 类提供命令参
数
缓存功能,可以用来提高性能。该类由许多 Execute 方法(尤其是那些只运行存储过程的重写方法)在内部使用。
数
据访问客户端也可以直接使用它来缓存特定命令的特定参
数
集。 使用 SqlHelper 类执行命令 SqlHelper 类提供了五种 Shared (Visual Basic) 或 static (
C#
) 方法,它们是:ExecuteNonQuery、ExecuteDataset、ExecuteReader、ExecuteScalar 和 ExecuteXmlReader。实现的每种方法都提供一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问
数
据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参
数
,因此开发人员可以确定传递连接、事务和参
数
信息的方式。类中实现的所有方法都支持以下重载: [
C#
] Execute* (SqlConnection connection, CommandType commandType, string commandText) Execute* (SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) Execute* (SqlConnection connection, string spName, params object[] parameterValues) Execute* (SqlConnection connection, CommandType commandType, string commandText) Execute* (SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) Execute* (SqlConnection connection, string spName, params object[] parameterValues) 除这些重载以外,除 ExecuteXmlReader 之外的其他方法还提供了另一种重载:允许将连接信息作为连接字符串而不是连接
对象
来传递,如下面的方法签名所示: [Visual Basic] Execute* (ByVal connectionString As String, _ ByVal commandType As CommandType, _ ByVal commandText As String) Execute* (ByVal connectionString As String, _ ByVal commandType As CommandType, _ ByVal commandText As String, _ ByVal ParamArray commandParameters() As SqlParameter) Execute* (ByVal connectionString As String, _ ByVal spName As String, _ ByVal ParamArray parameterValues() As Object) [
C#
] Execute* (string connectionString, CommandType commandType, string commandText) Execute* (string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) Execute* (string connectionString, string spName, params object[] parameterValues) 注意: ExecuteXmlReader 不支持连接字符串,因为:与 SqlDataReader
对象
不同,XmlReader
对象
在 XmlReader 关闭时没有提供自动关闭连接的方法。如果客户端传递了连接字符串,那么当客户端完成对 XmlReader 的操作后,将无法关闭与 XmlReader 相关联的连接
对象
。 通过参考 Data Access Application Block 程序集并导入 Microsoft.ApplicationBlocks.Data 命名空间,您可以轻松编写使用任何一种 SqlHelper 类方法的代码,如下面的代码示例所示: [Visual Basic] Imports Microsoft.ApplicationBlocks.Data [
C#
] using Microsoft.ApplicationBlocks.Data; 导入命名空间后,您可以调用任何 Execute* 方法,如下面的代码示例所示: [Visual Basic] Dim ds As DataSet = SqlHelper.ExecuteDataset( _ "SERVER=(local);DATABASE=Northwind;INTEGRATED SECURITY=True;", _ CommandType.Text, "SELECT * FROM Products") [
C#
] DataSet ds = SqlHelper.ExecuteDataset( "SERVER=DataServer;DATABASE=Northwind;INTEGRATED SECURITY=sspi;", _ CommandType.Text, "SELECT * FROM Products"); 使用 SqlHelperParameterCache 类管理参
数
SqlHelperParameterCache 类提供了三种可以用来管理参
数
的公共共享方法。它们是: CacheParameterSet。用于将 SqlParameters
数
组存储到缓存中。 GetCachedParameterSet。用于检索缓存的参
数
数
组的副本。 GetSpParameterSet。一种重载方法,用于检索指定存储过程的相应参
数
(首先查询一次
数
据库,然后缓存结果以便将来查询)。 缓存和检索参
数
通过使用 CacheParameterSet 方法,可以缓存 SqlParameter
对象
数
组。此方法通过将连接字符串和命令文本连接起来创建
一个
键,然后将参
数
数
组存储在 Hashtable 中。 要从缓存中检索参
数
,请使用 GetCachedParameterSet 方法。此方法将返回
一个
SqlParameter
对象
数
组,这些
对象
已使用缓存(与传递给该方法的连接字符串和命令文本相对应)中的参
数
的名称、值、方向和
数
据类型等进行了初始化。 注意: 用作参
数
集的键的连接字符串通过简单的字符串比较进行匹配。用于从 GetCachedParameterSet 中检索参
数
的连接字符串必须与用来通过 CacheParameterSet 来存储这些参
数
的连接字符串完全相同。语法不同的连接字符串即使语义相同,也不会被认为是匹配的。 以下代码显示了如何使用 SqlHelperParameterCache 类来缓存和检索 Transact-SQL 语句的参
数
。 [Visual Basic] 初始化连接字符串和命令文本 它们将构成用来存储和检索参
数
的键 Const CONN_STRING As String = _ "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;" Dim sql As String = _ "SELECT ProductName FROM Products " + _ "WHERE Category=@Cat AND SupplierID = @Sup" 缓存参
数
Dim paramsToStore(1) As SqlParameter paramsToStore(0) = New SqlParameter("@Cat", SqlDbType.Int) paramsToStore(1) = New SqlParameter("@Sup", SqlDbType.Int) SqlHelperParameterCache.CacheParameterSet(CONN_STRING, _ sql, _ paramsToStore) 从缓存中检索参
数
Dim storedParams(1) As SqlParameter storedParams = SqlHelperParameterCache.GetCachedParameterSet( _ CONN_STRING, sql) storedParams(0).Value = 2 storedParams(1).Value = 3 在命令中使用参
数
Dim ds As DataSet ds = SqlHelper.ExecuteDataset(CONN_STRING, _ CommandType.Text, _ sql, storedParams) [
C#
] // 初始化连接字符串和命令文本 // 它们将构成用来存储和检索参
数
的键 const string CONN_STRING = "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"; string spName = "SELECT ProductName FROM Products " + "WHERE Category=@Cat AND SupplierID = @Sup"; // 缓存参
数
SqlParameter[] paramsToStore = new SqlParameter[2]; paramsToStore[0] = New SqlParameter("@Cat", SqlDbType.Int); paramsToStore[1] = New SqlParameter("@Sup", SqlDbType.Int); SqlHelperParameterCache.CacheParameterSet(CONN_STRING, sql, paramsToStore); // 从缓存中检索参
数
SqlParameter storedParams = new SqlParameter[2]; storedParams = SqlHelperParameterCache.GetCachedParameterSet( CONN_STRING, sql); storedParams(0).Value = 2; storedParams(1).Value = 3; // 在命令中使用参
数
DataSet ds; ds = SqlHelper.ExecuteDataset(CONN_STRING, CommandType.StoredProcedure, sql, storedParams); 检索存储过程参
数
SqlHelperParameterCache 还提供了针对特定存储过程检索参
数
数
组的方法。一种名为 GetSpParameterSet 的重载方法提供了此功能,它包含两种实现。该方法尝试从缓存中检索特定存储过程的参
数
。如果这些参
数
尚未被缓存,则使用 .NET 的 SqlCommandBuilder 类从内部检索,并将它们添加到缓存中,以便用于后续的检索请求。然后,为每个参
数
指定相应的参
数
设置,最后将这些参
数
以
数
组形式返回给客户端。以下代码显示了如何检索 Northwind
数
据库中 SalesByCategory 存储过程的参
数
。 [Visual Basic] 初始化连接字符串和命令文本 它们将构成用来存储和检索参
数
的键 Const CONN_STRING As String = _ "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;" Dim spName As String = "SalesByCategory" 检索参
数
Dim storedParams(1) As SqlParameter storedParams = SqlHelperParameterCache.GetSpParameterSet( _ CONN_STRING, spName) storedParams(0).Value = "Beverages" storedParams(1).Value = "1997" 在命令中使用参
数
Dim ds As DataSet ds = SqlHelper.ExecuteDataset(CONN_STRING, _ CommandType.StoredProcedure, _ spName, storedParams) [
C#
] // 初始化连接字符串和命令文本 // 它们将构成用来存储和检索参
数
的键 const string CONN_STRING = "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"; string spName = "SalesByCategory"; // 检索参
数
SqlParameter storedParams = new SqlParameter[2]; storedParams = SqlHelperParameterCache.GetSpParameterSet( CONN_STRING, spName); storedParams[0].Value = "Beverages"; storedParams[1].Value = "1997"; // 在命令中使用参
数
DataSet ds; ds = SqlHelper.ExecuteDataset(CONN_STRING, CommandType.StoredProcedure, spName, storedParams); 内部设计 Data Access Application Block 包含了完整的源代码和有关其设计的综合指南。本节介绍有关主要实现的详细信息。 SqlHelper 类实现详细信息 SqlHelper 类用于通过一组静态方法来封装
数
据访问功能。该类不能被继承或实例化,因此将其声明为包含专用构造函
数
的不可继承类。 在 SqlHelper 类中实现的每种方法都提供了一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问
数
据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参
数
,因此开发人员可以确定传递连接、事务和参
数
信息的方式。在 SqlHelper 类中实现的方法包括: ExecuteNonQuery。此方法用于执行不返回任何行或值的命令。这些命令通常用于执行
数
据库更新,但也可用于返回存储过程的输出参
数
。 ExecuteReader。此方法用于返回 SqlDataReader
对象
,该
对象
包含由某一命令返回的结果集。 ExecuteDataset。此方法返回 DataSet
对象
,该
对象
包含由某一命令返回的结果集。 ExecuteScalar。此方法返回
一个
值。该值始终是该命令返回的第一行的第一列。 ExecuteXmlReader。此方法返回 FOR XML 查询的 XML 片段。 除了这些公共方法外,SqlHelper 类还包含一些专用函
数
,用于管理参
数
和准备要执行的命令。不管客户端调用什么样的方法实现,所有命令都通过 SqlCommand
对象
来执行。在 SqlCommand
对象
能够被执行之前,所有参
数
都必须添加到 Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专用函
数
主要用于提供一种一致的方式,以便向 SQL Server
数
据库发出命令,而不考虑客户端应用程序调用的重载方法实现。SqlHelper 类中的专用实用程序函
数
包括: AttachParameters:该函
数
用于将所有必要的 SqlParameter
对象
连接到正在运行的 SqlCommand。 AssignParameterValues:该函
数
用于为 SqlParameter
对象
赋值。 PrepareCommand:该函
数
用于对命令的属性(如连接、事务环境等)进行初始化。 ExecuteReader:此专用 ExecuteReader 实现用于通过适当的 CommandBehavior 打开 SqlDataReader
对象
,以便最有效地管理与阅读器关联的连接的有效期。 SqlHelperParameterCache 类实现详细信息 参
数
数
组缓存在专用 Hashtable 中。从缓存中检索的参
数
进行内部复制,这样客户端应用程序能够更改参
数
值以及进行其他操作,而不会影响缓存的参
数
数
组。专用共享函
数
CloneParameters 可以实现此目的。 常见问题 此版本包含哪些新增功能? 与 Data Access Application Block Beta 2.0 版本相比,该 RTM 版本包含以下新增功能和变化: SqlHelper 类方法的事务型重载不再需要 SqlConnection 参
数
。在此版本中,连接信息从 SqlTransaction
对象
中派生,因此不必在方法签名中包含 SqlConnection
对象
参
数
。 现在,GetSpParameterSet 方法使用 ADO.NET CommandBuilder 类的 DeriveParameters 方法来确定存储过程所需要的参
数
。这比 Beta 2.0 版本中直接通过查询
数
据库来检索信息的效率更高。 可以使用 XCOPY 部署方法来部署 Data Access Application Block 程序集吗? 可以。Microsoft.ApplicationBlocks.Data.dll 程序集在编译后可以使用 XCOPY 进行部署。 什么时候应该使用 ExecuteDataset 方法,什么时候应该使用 ExecuteReader 方法? 这个问题实际上是什么时候应该返回 DataSet
对象
中的多个
数
据行,什么时候应该使用 DataReader。答案取决于您的应用程序的特定需要,以及您在灵活性和原始性能之间的取舍。DataSet 为您提供
数
据的灵活的且断开连接的关系视图,而 DataReader 为您提供性能卓越的、只读的、仅向前光标。有关 DataSet 和 DataReader 的全面比较,请参阅 asp">Data Access Architecture Guide(英文)。 如何使用 ExecuteDataset 返回包含多个表的
数
据集? 通过创建
一个
可以返回多个行集的存储过程(通过执行多个 SELECT 语句或者对其他存储过程进行嵌套调用),并使用 ExecuteDataset 方法执行该过程,您可以检索包含多个表的
数
据集。 例如,假设您的
数
据库包含以下存储过程。 CREATE PROCEDURE GetCategories AS SELECT * FROM Categories GO CREATE PROCEDURE GetProducts AS SELECT * FROM Products 您可以创建
一个
主存储过程来对这些过程进行嵌套调用,如下面的代码示例所示。 CREATE PROCEDURE GetCategoriesAndProducts AS BEGIN EXEC GetCategories EXEC GetProducts END 使用 ExecuteDataset 方法执行此主存储过程将返回
一个
DateSet,其中包含两个表:
一个
表包含分类
数
据,另
一个
表包含产品
数
据。 注意: ExecuteDataset 方法不提供为返回的表指定自定义名称的方法。第
一个
表的编号始终为 0,名称为 Table,第二个表的编号为 1,名称为 Table1,依此类推。
C#
之面向
对象
除了身边的女朋友,我们要掌握另
一个
面向
对象
编程,循序渐进的课程设计,单个概念的拆分,从理论到实践,从一头雾水至水到渠成,其实面向
对象
编程也没什么嘛,五斗米老师已经帮你备好晚宴,开餐吧~
C#
语言系列课程分为:1.
C#
急速入门观看地址:https://edu.csdn.net/course/detail/205892.
C#
之面向
对象
3.
C#
高级进阶观看地址:https://edu.csdn.net/course/detail/310654.程序员内功修炼 -
数
据结构(
C#
)观看地址:https://edu.csdn.net/course/detail/10505
C#
类和
对象
C#
类和
对象
C#
对象
对于
引用
非静态字段、方法或属性是必需的
非静态类的方法是不能直接调用的,需要实例化,但当有时需在各个地方去调用该方法时,逐个去实例化会显得麻烦,可以采用
一个
静态类来封装后使用。 用开关灯来举个例子: 假设灯是
一个
非静态类,可开关,有状态 class Light { public string Status = "Open"; public void OpenLight() ...
C#
110,537
社区成员
642,576
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章