c# - 在 C# 中存储永远不会改变的静态数据的最佳方法是什么

标签 c# asp.net-mvc

我有一个类将数据存储在永不更改的 asp.net c# 应用程序中。我真的不想将这些数据放入数据库中——我希望它保留在应用程序中。这是我在应用程序中存储数据的方式:

public class PostVoteTypeFunctions
{
    private List<PostVoteType> postVotes = new List<PostVoteType>();
    public PostVoteTypeFunctions()
    {
        PostVoteType upvote = new PostVoteType();
        upvote.ID = 0;
        upvote.Name = "UpVote";
        upvote.PointValue = PostVotePointValue.UpVote;
        postVotes.Add(upvote);

        PostVoteType downvote = new PostVoteType();
        downvote.ID = 1;
        downvote.Name = "DownVote";
        downvote.PointValue = PostVotePointValue.DownVote;
        postVotes.Add(downvote);

        PostVoteType selectanswer = new PostVoteType();
        selectanswer.ID = 2;
        selectanswer.Name = "SelectAnswer";
        selectanswer.PointValue = PostVotePointValue.SelectAnswer;
        postVotes.Add(selectanswer);

        PostVoteType favorite = new PostVoteType();
        favorite.ID = 3;
        favorite.Name = "Favorite";
        favorite.PointValue = PostVotePointValue.Favorite;
        postVotes.Add(favorite);

        PostVoteType offensive = new PostVoteType();
        offensive.ID = 4;
        offensive.Name = "Offensive";
        offensive.PointValue = PostVotePointValue.Offensive;
        postVotes.Add(offensive);

        PostVoteType spam = new PostVoteType();
        spam.ID = 0;
        spam.Name = "Spam";
        spam.PointValue = PostVotePointValue.Spam;
        postVotes.Add(spam);
    }
}

当构造函数被调用时,上面的代码就会运行。我也有一些函数可以查询上面的数据。但这是在 asp.net 中存储信息的最佳方式吗?如果不是,你会推荐什么?

最佳答案

这是一个“看起来像”枚举的不可变结构的候选者: (另外,我注意到你对其中两个使用了相同的 id 值,所以我修复了这个...... 您可以像使用枚举一样使用以下内容...

PostVoteTypeFunctions myVar = PostVoteTypeFunctions.UpVote;

真正的好处是这种方法不需要实例存储,只需要一个 4 字节整数(它将存储在堆栈中,因为它是一个结构)。所有硬编码值都存储在类型本身中……每个 AppDomain 中只有一个……

public struct PostVoteTypeFunctions 
{ 
    private int id;
    private bool isDef;
    private PostVoteTypeFunctions ( )  { } // private to prevent direct instantiation
    private PostVoteTypeFunctions(int value) { id=value; isDef = true; }

    public bool HasValue { get { return isDef; } }
    public bool isNull{ get { return !isDef; } }
    public string Name 
    { 
       get 
       {  return 
             id==1? "UpVote":
             id==2? "DownVote":
             id==3? "SelectAnswer":
             id==4? "Favorite":
             id==5? "Offensive":
             id==6? "Spam": "UnSpecified";
       }
    }
    public int PointValue 
    { 
       get 
       {  return // Why not hard code these values here as well  ?
             id==1? PostVotePointValue.UpVote:
             id==2? PostVotePointValue.DownVote
             id==3? PostVotePointValue.SelectAnswer:
             id==4? PostVotePointValue.Favorite:
             id==5? PostVotePointValue.Offensive:
             id==6? PostVotePointValue.Spam: 
                    0;
       }
    }
    // Here Add additional property values as property getters 
    // with appropriate hardcoded return values using above pattern

    // following region is the static factories that create your instances,
    //  .. in a way such that using them appears like using an enumeration
    public static PostVoteTypeFunctions UpVote = new PostVoteTypeFunctions(1);
    public static PostVoteTypeFunctions DownVote= new PostVoteTypeFunctions(2);
    public static PostVoteTypeFunctions SelectAnswer= new PostVoteTypeFunctions(3);
    public static PostVoteTypeFunctions Favorite= new PostVoteTypeFunctions(4);
    public static PostVoteTypeFunctions Offensive= new PostVoteTypeFunctions(5);
    public static PostVoteTypeFunctions Spam= new PostVoteTypeFunctions(0);       
} 

关于c# - 在 C# 中存储永远不会改变的静态数据的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2907259/

相关文章:

c# - 使用 ffmpeg/ffprobe 获取视频的长度不起作用

c# - 将 PartialView 渲染到部分

asp.net-mvc - 为什么 MVC 4 bundle 不捆绑 Knockout.js?

c# - 在泛型方法中创建返回类型的实例

c# - 在重定向时显示动画 gif 文件直到 asp 页面加载?

javascript - 客户端对表单的一部分进行验证

c# - 如何在MVC 4项目中制作显示模板

c# - 如何使用ValidationResult asp .net返回错误代码

c# - 什么是支持 LINQ 的 "mobile".NET 数据库?

c# - 在 C# 可执行文件中构建 .sln