请教一个 c# 在静态类里定义个全局对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教一个 c# 在静态类里定义个全局对象相关的知识,希望对你有一定的参考价值。

using System;
using System.Collections.Generic;
using System.Text;
using Hy.Models;
using Hy.DAL.XiTong;
using System.Data;
using System.Web;
using Hyby.Component;
using Hy.Common.HyCommon;
using Hy.BLL.HySystem;
namespace Hy.BLL

public static class ExecuteBillManager

public static string ExecuteBind(int pageIndex, int pageSize, string WhereStr, ExecuteBillModel eb, string Taskno)





我有一个这样的静态类里面也是静态方法然后这个类里面有几个方法需要用到对象 UserAccess Uaxy = PubFunction.ThisLimit();
然后我或者里面的属性的值(Uaxy.Username 在里面已经设置值了)
问题是 : 如果我把UserAccess Uaxy = PubFunction.ThisLimit();放到类里面供全局使用 也就是
public static class ExecuteBillManager

UserAccess Uaxy = PubFunction.ThisLimit();
...静态方法1
...静态方法2

那么在程序第一次启动时他可以获取到值 然后当我再次调用静态方法时 Uaxy.Username 的值 总是第一次那个值 (就像缓存一样) 但是我只要把UserAccess Uaxy = PubFunction.ThisLimit();放到每一个方法里去调用那么值肯定变

这是什么原因呢 我以前有过一次 在类里面定义了一个 全局变量 供所有方法使用 但是也是在值上出现了问题 到时静态类的事 还是 c#就不可以在类里面定义全局的东西 变量或者 调用其他方法

参考技术A 把我给看晕了,首先在c#里定义一个全局变量肯定是没问题的
你要清楚静态变量跟静态方法在本质上是有区别的
变量可以是全局的,但是方法没有全局的这个概念
静态方法与静态变量的区别:
静态方法只是可以无需对类进行实例化便可调用,不过静态类只能使用静态变量(属性),而非静态的方法可以调用类中的所有成员,在外部使用静态方法与非静态方法其实没有多大区别
类中静态变量其实就是全局变量,任何对该类的这个变量进行的操作都是互相影响的
PS:如果你只要一个全局变量,一个方法外部的静态变量就可以了,放在方法内部的变量叫局部变量追问

就是说我刚开始一个静态类里面有三个方法然后我是在每一个方法里都写了一遍 UserAccess Uaxy = PubFunction.ThisLimit()(这个是返回当前登录人的一些基本信息 角色了 登录名了 等等...) 然后呢 我现在 想在顶部 也就是类里面直接声明,下面无论哪方法直接Uaxy . 就Ok了,但是这就是问题了 发现 Uaxy 总也不更新都是第一次的值 ,然后除非过五分钟之后 它会更新 就像缓存一样,但是我给他放到每一个方法里就好使...

追答

你不会是把UserAccess Uaxy = PubFunction.ThisLimit();这个写到全局了吧
这样写的话其实相当于只对UserAccess进行了初始化PubFunction.ThisLimit();的值
也就是说只有第一次调用UserAccess时为UserAccess赋予了PubFunction.ThisLimit()的值
以后每次调用UserAccess都只是使用这个值,而不再动态执行PubFunction.ThisLimit()
所以总是第一次的值
你需要在每个方法里执行一遍Uaxy = PubFunction.ThisLimit();
UserAccess Uaxy作为全局变量只是为了统一性和跨方法
PS:至于为什么过5分钟后会更新可能是变量在内存中的保存时间问题

追问

我单步调试的时候 他也是不走上面那个,我想知道是不是静态类的事啊, 如果是 实例化的类 会是这样吗。以前有一次 也是在静态类里定义了个全局变量用来返回字符串 结果我在第一个功能下 接收的字符串正常 然后在第二个功能下 发现字符串还是上一次那个 如果是在 Page页里 在类的下片就好使 所以 我感觉应该是静态类的问题,静态类的构造方法貌似也不会执行

追答

这跟静态类无关,跟静态全局变量和静态构造函数的性质有关,在非静态类里效果也是一样的
1、静态全局变量在类未被实例化前就已经初始化并保存在内存中了(不管是否静态类),
所以它理论上只初始化一次,如果你只在初始化时给它赋值,则会一直保存该值,不会再次进行初始化
2、你在Page页里面的全局变量不是静态的吧,静态类里只能有静态变量,所以这个跟是否静态类无关,而在于你的全局变量是否静态,实例化类里采用静态变量跟静态类的效果应该是一样的
3、静态构造函数跟静态变量一样,在类实例化前就执行了,且只执行一次,跟是否静态类无关,静态类里只能有静态构造函数,而非静态类里也可以有静态构造函数,效果跟静态类里一样

追问

哦 我还是缺乏这方面知识 那应该是 只能一个方法一个方法调了

本回答被提问者和网友采纳

c#静态变量和非静态变量的区别

  静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

详解:

一,静态资源在首次访问时会调用静态构造器创建类类型对象(静态属于类,动态属于对象,静态被静态构造器创建,动态被普通构造创建,所以实例对象的时候,静态不会被重新构造),

二,类型对象的生存周期是整个应用程序域的生存周期,也就说被访问过的静态资源,只有它所在的应用程序域被卸载时才会被卸载,静态变量始终存在着,也就是说它的生存期为整个源程序。

三,当页面第一次被访问的时候,相当于页面被构造,静态变量被静态构造器初始化,然后再次访问这个页面的时候,虽然非静态资源重新被构造,但是此时静态资源并不被重新构造并一直存在(也可以用来做页面状态保持,不过不建议用,因为一直占用资源,不像session还定时被回收),直至应用程序域被回收。(构造类静态若局部未赋以初值,则由系统自动赋以0值。 )

四,如果是application级的,用静态变量来代替application对象是可以的,优点是速度快(存储区域不同,而且不用装箱拆箱),缺点是没有application对象通用(application对象可以随意存储任何对象)

五,就是页面的静态变量页面第一次被访问时被初始化,在应用程序域一直保存,动态变量只在一个http请求作用(每次http请求相当于实例一次页面这个类)

六,静态变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而变量属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。

七,由静态构造而联想到的问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StaticDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建包含静态构造函数的类实例时和访问包含静态构造函数的静态成员时,先调用静态构造函数,无论创建了多少个类实例和调用多少次静态成员,其静态构造函数都只调用了一次。
            StaticTest s = new StaticTest();
            StaticTest s2 = new StaticTest();
            //s.Say(); //无法使用实例来引用来访问静态成员
            StaticTest.Say();
            StaticTest.Say();
            Console.WriteLine(StaticTest.constdemo);

            //调用静态类的静态方法,其中的静态构造也是只被调用一次
            StaticTest2.Say();
            StaticTest2.Say();
            Console.ReadKey();
            
        }
    }
    public class StaticTest
    {
        //静态构造方法不可以被修饰符public等修饰,静态构造必须无参数
        //public static StaticTest()
        static StaticTest()
        {
            Console.WriteLine("非静态类的静态构造方法只被调用一次"); 
        }
        //无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
        public StaticTest() {
            Console.WriteLine("非静态类的非静态构造方法可以共存");
        }
        //虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。
        //这样的字段属于类,不属于类的实例。因此,可以同对待静态字段一样使用 ClassName.MemberName 表示法来访问 const 字段
        public const int constdemo = 1;
        public static void Say()
        {
            Console.WriteLine("非静态类的的静态方法");
        }
    }

    public static class StaticTest2
    {
        static StaticTest2()
        {
            Console.WriteLine("静态类的静态构造方法只被调用一次");
        }
         public static void Say()
        {
            Console.WriteLine("静态类的的静态方法");
        }
    }
}

 

1》虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。

2》静态构造方法不可以被修饰符public等修饰,静态构造必须无参数

3》创建包含静态构造函数的类实例时和访问包含静态构造函数的静态成员时,先调用静态构造函数,无论创建了多少个类实例和调用多少次静态成员,其静态构造函数都只调用了一次。

4》无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。

以上是关于请教一个 c# 在静态类里定义个全局对象的主要内容,如果未能解决你的问题,请参考以下文章

spring中静态类调用非静态对象的方法

C#中static关键字的作用

C#中static静态变量的用法

请教一下C#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行

如何在C#中,在一个类里调用另外一个类的方法

在C#中静态变量是否全局变量