随笔 - 547  文章 - 213 评论 - 417 阅读 - 107万

CommunityServerBlogs\BlogFeedback.cs中有如下的一段代码:

/// <summary>
/// Gets the feedback items for the given Weblog
/// </summary>
/// <returns>Returns an ArrayList of FeedBackItem objects.</returns>
public static ArrayList GetFeedback( Int32 weblogID ) 
{
 
int outRecords;
 
return GetFeedback( weblogID,0,0out outRecords);
}

 

/// <summary>
/// Gets a paged set of feedback items for the given weblogs
/// </summary>
/// <returns>Returns an ArrayList of FeedBackItem objects.</returns>
public static ArrayList GetFeedback( Int32 blogId, Int32 pageIndex, Int32 pageSize, out Int32 totalRecords ) 
{
 WeblogDataProvider wdp 
= WeblogDataProvider.Instance();
 
return wdp.GetFeedback( blogId,pageIndex, pageSize, out totalRecords);
}

 

可以看到,为了调用者获得一组FeedBack的信息,该文件定义了两个GetFeedback方法,使用第一个方法可以获得所有的记录,使用第二个方法将可以自定义记录的分页。第一个方法中调用第二个方法。因此第二个方法中具有通向底层的接口。这个接口就是WeblogDataProvider类的实例wdp。

在第二个方法中,首先调用 WeblogDataProvider.Instance()静态方法产生一个 WeblogDataProvider类的实例.然后调用该实例的GetFeedback方法来获得记录.
---------------------------------------------
现在看看为什么不直接实例化WeblogDataProvider类而是要调用Instance()静态方法那?

下面是WeblogDataProvider类的代码:

 

 

看了一下晕了,竟然是抽象类,竟然可以直接调用里面的Instrance()方法.
再看看这个Instance()方法:

private static WeblogDataProvider _defaultInstance = null;

 

public static WeblogDataProvider Instance() 
{
    
return _defaultInstance;
}

 

静态方法竟然可以返回类中的静态变量,这个静态变量初始值是null,
在哪里初始化的那?看看这个线索:

static WeblogDataProvider()
{
    CreateDefaultCommonProvider();
}

 

/// <summary>
/// Creates the Default CommonDataProvider
/// </summary>
private static void CreateDefaultCommonProvider()
{
    
// Get the names of the providers
    
//
    CSConfiguration config = CSConfiguration.GetConfig();

    
// Read the configuration specific information
    
// for this provider
    
//
    Provider sqlForumsProvider = (Provider) config.Providers[WeblogDataProviderName];

    
// Read the connection string for this provider
    
//
    
    _defaultInstance 
= DataProviders.CreateInstance(sqlForumsProvider) as WeblogDataProvider;
}

 

可以看到,_defaultInstance是在构造函数中被初始化的.
-------------------------------------------
至此,有两个问题:
1. 构造函数竟然也写成静态的,作用是什么?
2. 没有加public , 那么这个方法是公有的还是私有的
3. 那么这个_defaultInstance是什么时候被初始化的那?

--------------------------------------------------------------------------------------
关于第1个问题,我自己的理解是:
   既然_defaultInstance是静态成员,那么一旦被初始化以后,将会一直保持到当前Application的终止。
所以以后就不用再初始化了。但是为什么要采用这种方式,为什么不采用SingleTon模式,或者说这种写法就是SingleTon模式的变种?

关于第2个问题,msdn中的论述如下:
  任何未显式声明的成员均默认为 Public,但字段或常量除外,它们默认为 Private
由此可见,WeblogDataProvider()这个构造函数是公共(public)的。

关于第3个问题,我在整个解决方案中查找WeblogDataProvider关键字。发现没有一个方法调用WeblogDataProvider()构造函数,
但是,却有很多调用Instance()方法的语句,难道静态的构造函数会自动执行吗?

posted on   今夜太冷  阅读(738)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示