new 和 static

seandro 2013-12-13 02:41:58
在System.Web.UI.Page下
有几个页面要用到的语句是一样的,为了方便改动,当然是放在一个通用的类里。
第一种:
int Num = CommonRequest.GetUserLoginTimes(user)
代码:

public class CommonRequest//通用
{
public static int GetUserLoginTimes(User user)//static
{
return User.Type == "admin"?ServiceFactory.GetFactory().GetUserService().GetUserLoginTimes(User.userId):0;
}
}


第二种:
UserRequest ur = new UserRequest();//new
int Num = ur.GetUserLoginTimes(user)
代码:

public class UserRequest//独立类
{
public int GetUserLoginTimes(User user)
{
return User.Type == "admin"?ServiceFactory.GetFactory().GetUserService().GetUserLoginTimes(User.userId):0;
}
}




请问这有什么区别吗?
...全文
333 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianhenjh 2013-12-16
  • 打赏
  • 举报
回复
我通常把静态方法用在需要某些全局变量的地方。
jiaoshiyao 2013-12-16
  • 打赏
  • 举报
回复
引用 8 楼 seandro 的回复:
[quote=引用 7 楼 jiaoshiyao 的回复:] [quote=引用 5 楼 seandro 的回复:] [quote=引用 3 楼 hdhai9451 的回复:] 静态方法调用一次后常驻内存,new实例化的类每次调用都要先实例化,调用结束后不再占用内存
就是经常要用到这静态个方法,值不会受影响吧。 还有个问题,当通用的方法特别特别的多,基本每次请求都用到,而每天有百多万次的请求,在这种情况下用静态的好,还是实例化的好呢?[/quote]当然是new的好 [/quote] 如果把很多通用的方法写到一个类comm, 页面A处理过程中,需要用到类B于是就实例化B,然后B要实例化C A和B和C都需要用到通用方法comm,考虑到线程问题就不用静态调用了, 那是不是ABC都得实例化comm呢,因为comm里面方法很多,如果是都得实例化的话那不是一个请求要实例化3次comm,内存会不会占太多了?还是有更好的办法[/quote] new出来更安全 以后的问题更少 也占用不了多少内存
seandro 2013-12-16
  • 打赏
  • 举报
回复
引用 17 楼 dongxinxi 的回复:
[quote=引用 15 楼 b_duan 的回复:] 如果涉及到线程并发的应该就不会用static方法了
如果没有使用到任何成员变量(定义在方法外面),一样不会有任何问题[/quote]
引用 17 楼 dongxinxi 的回复:
[quote=引用 15 楼 b_duan 的回复:] 如果涉及到线程并发的应该就不会用static方法了
如果没有使用到任何成员变量(定义在方法外面),一样不会有任何问题[/quote]

public class ComUtils
{
    public static string GetCookieStr(string s)//获得cookie值
    {
        HttpCookie c = HttpContext.Current.Request.Cookies[s];
        return c == null ? "" : c.Value;
    }
    public static string GetMd5(string s)//获得md5密文
    {
        MD5 md5 = new MD5();//实例
        return string.IsNullOrEmpty(s) ? "" : md5.GetMD5(s);
    }
    public static string GetReferrer//获得UrlReferrer
    {
        get
        {
            Uri Uri = HttpContext.Current.Request.UrlReferrer;
            return Uri == null ? "" : Uri.Host.ToString();
        }
    }
    public static string GetUrlTokenDecode(string s)//获得UrlTokenDecode
    {
        try
        {
            return string.IsNullOrEmpty(s) ? "" : Encoding.Default.GetString(HttpServerUtility.UrlTokenDecode(s));
        }
        catch { log4net.Error("GetTokenDecode, s=" + s); return ""; }
    }
}
这种适合用static么,又比如获取客户端IP这种使用量巨大,没个用户过来第一件事就是拿IP,

public static string GetIPAddress()
    {
        string s = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        if (string.IsNullOrEmpty(s))
        {
            s = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        }
        if (string.IsNullOrEmpty(s))
        {
            s = HttpContext.Current.Request.UserHostAddress;
        }
        if (string.IsNullOrEmpty(s))
        {
            return "";
        }
        return s;
}
这样的合适用static不
  • 打赏
  • 举报
回复
引用 15 楼 b_duan 的回复:
如果涉及到线程并发的应该就不会用static方法了
如果没有使用到任何成员变量(定义在方法外面),一样不会有任何问题
  • 打赏
  • 举报
回复
引用 3 楼 hdhai9451 的回复:
静态方法调用一次后常驻内存,new实例化的类每次调用都要先实例化,调用结束后不再占用内存
方法内使用的局部变量都会释放(当然指的是栈上的),但使用到的静态成员变量不会(分配的区不一样) 程序集加载后,不管是静态还是实例方法,都会保存方法目录(类似一张表,保存各个方法的地址) 直到程序集被卸载/进程结束 所以两者在使用上没有区别,只是在OOP设计上不同
b_duan 2013-12-16
  • 打赏
  • 举报
回复
如果涉及到线程并发的应该就不会用static方法了
Persistence_x 2013-12-16
  • 打赏
  • 举报
回复
如果常用的用静态的较为方便
seandro 2013-12-14
  • 打赏
  • 举报
回复
引用 9 楼 claymore1114 的回复:
不要去考虑内存,静态方法和非静态方法基本一样,都在方法表里,分配在加载堆中,一直存在,只是调用的方式不一样。 考虑你个类的作用和功能,new实例化一个类 可以在运行时进行初始化值、可以实现接口、重写方法等等。。。 如果 只是一个简单的类,如 Comm类,用静态方法更方便调用。
可是并发大的话,方法又用得很频繁,用静态方法好像会出线程问题
mmqw 2013-12-14
  • 打赏
  • 举报
回复
静态和非静态
claymore1114 2013-12-14
  • 打赏
  • 举报
回复
不要去考虑内存,静态方法和非静态方法基本一样,都在方法表里,分配在加载堆中,一直存在,只是调用的方式不一样。 考虑你个类的作用和功能,new实例化一个类 可以在运行时进行初始化值、可以实现接口、重写方法等等。。。 如果 只是一个简单的类,如 Comm类,用静态方法更方便调用。
seandro 2013-12-14
  • 打赏
  • 举报
回复
引用 7 楼 jiaoshiyao 的回复:
[quote=引用 5 楼 seandro 的回复:] [quote=引用 3 楼 hdhai9451 的回复:] 静态方法调用一次后常驻内存,new实例化的类每次调用都要先实例化,调用结束后不再占用内存
就是经常要用到这静态个方法,值不会受影响吧。 还有个问题,当通用的方法特别特别的多,基本每次请求都用到,而每天有百多万次的请求,在这种情况下用静态的好,还是实例化的好呢?[/quote]当然是new的好 [/quote] 如果把很多通用的方法写到一个类comm, 页面A处理过程中,需要用到类B于是就实例化B,然后B要实例化C A和B和C都需要用到通用方法comm,考虑到线程问题就不用静态调用了, 那是不是ABC都得实例化comm呢,因为comm里面方法很多,如果是都得实例化的话那不是一个请求要实例化3次comm,内存会不会占太多了?还是有更好的办法
jiaoshiyao 2013-12-13
  • 打赏
  • 举报
回复
引用 5 楼 seandro 的回复:
[quote=引用 3 楼 hdhai9451 的回复:] 静态方法调用一次后常驻内存,new实例化的类每次调用都要先实例化,调用结束后不再占用内存
就是经常要用到这静态个方法,值不会受影响吧。 还有个问题,当通用的方法特别特别的多,基本每次请求都用到,而每天有百多万次的请求,在这种情况下用静态的好,还是实例化的好呢?[/quote]当然是new的好
siemens_chang 2013-12-13
  • 打赏
  • 举报
回复
static变量或函数第一次加载的时候会一直在内存当中
seandro 2013-12-13
  • 打赏
  • 举报
回复
引用 3 楼 hdhai9451 的回复:
静态方法调用一次后常驻内存,new实例化的类每次调用都要先实例化,调用结束后不再占用内存
就是经常要用到这静态个方法,值不会受影响吧。 还有个问题,当通用的方法特别特别的多,基本每次请求都用到,而每天有百多万次的请求,在这种情况下用静态的好,还是实例化的好呢?
好大一只鸭 2013-12-13
  • 打赏
  • 举报
回复
引用 3 楼 hdhai9451 的回复:
静态方法调用一次后常驻内存,new实例化的类每次调用都要先实例化,调用结束后不再占用内存
Andy__Huang 2013-12-13
  • 打赏
  • 举报
回复
静态方法调用一次后常驻内存,new实例化的类每次调用都要先实例化,调用结束后不再占用内存
Andy__Huang 2013-12-13
  • 打赏
  • 举报
回复
第一种应该这样写: public static class CommonRequest//通用 { public static int GetUserLoginTimes(User user)//static { return User.Type == "admin"?ServiceFactory.GetFactory().GetUserService().GetUserLoginTimes(User.userId):0; } } 这样外部调用时,可以直接调用。 第二种调用方法,外边调用时要实例化才可以调用
sj490790083 2013-12-13
  • 打赏
  • 举报
回复
静态方法和非静态方法的区别 ,Google一搜一大堆

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧