初学:请问为什么在结构中的方法要加static

jthkl 2017-01-26 12:03:52
春节没人陪,凄凄惨惨戚戚,闲来无事学习一下c#
看到书中代码如下

struct ScreenPosition
{
private int _x, _y;
public ScreenPosition(int X, int Y)
{
this._x = rangeCheckedX(X);
this._y = rangeCheckedY(Y);
}
private static int rangeCheckedX(int x)
{
if (x < 0 || x > 1280)
{
throw new ArgumentOutOfRangeException("X");
}
return x;
}
private static int rangeCheckedY(int y)
{
if (y < 0 || y > 1024)
{
throw new ArgumentOutOfRangeException("Y");
}
return y;
}
public int X
{
get { return this._x; }
set { this._x = rangeCheckedX(value); }
}
public int Y
{
get { return this._y; }
set { this._y = rangeCheckedY(value); }
}
}

请问为什么 private static int rangeCheckedX(int x)要有前缀static?
如果我把struct 变成class那么就可以没有,而且看起来无论有没有都可以正常运行,请问为什么啊?
...全文
209 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
实际上,你深入理解一点点这里的原理,然后就可以对那种争议一笑了之。因此你此时还没有必要去纠结这些的设计阶段,还不知道将来会有什么需求。
  • 打赏
  • 举报
回复
引用 楼主 jthkl 的回复:
请问为什么 private static int rangeCheckedX(int x)要有前缀static?
不是“要有”。假设写了也可以、不写也可以,意思完全不一样,但是功能结果一样,那么不同的人就会纠结不同的“洁癖”。有的人觉得定义在类型接口上的 static 方法才牛逼,有的人觉得定义在对象实例接口上调用的方法才适合自己入门。 实际上,你深入理解一点点理解,然后就可以对那种争议一笑了之。因此你此时还到必要去纠结这些的阶段,不知道将来会有什么需求。
  • 打赏
  • 举报
回复
static 方法并不是定义在对象模型接口上,而是定义在类型模型接口上的,它与对象自身无关,使用它的时候不需要考虑对象实例(不管是值类型对象还是引用类型对象)。 既然跟对象自身无关,那么在系统底层管理上自然也就是简单一些。例如某个应用程序运行时有几百万个对象,而类型也不过就几百种,那么经常有人说 static 方法“效率高那么一点点”(虽然感觉不出来),觉得心里安慰。 当然从逻辑上说,它不涉及对象自身,你的 rangeCheckedX 方法中并没有用到(也不可能用到)_x、_y 啊! 初学者其实可以在代码中把所有 static 方法都提取出来,与非 static 方法分开放。如果是更好的初学者编程语言,将“方法库”跟对象自身的方法分开成两个代码块去声明,我觉得其实更好一些,而c#语法在这方面有一丁点欠缺。
jthkl 2017-01-26
  • 打赏
  • 举报
回复

namespace AutomaticProperties
{
    class Program
    {
        static void doWork()
        {
            ScreenPosition origin = new ScreenPosition(0,1000);
            origin.X = origin.X + 1;
            Console.WriteLine(origin.X);
        }

        static void Main(string[] args)
        {
            try
            {
                doWork();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
这里也是,如果 static void doWork()不是static那么就出错了,静态在这里什么作用呢?
  • 打赏
  • 举报
回复
你的第二段程序,main其实是 windows sdk 传统的写法,它不是面向对象的,它就是从(你这里) Program 类型中找到 Main 方法,而不是从一个 Program 对象中去找 Main 方法。 Main 不是对象的方法,当Main 调用 doWork 的时候也不是从某个对象实例上去调用这个方法,而是调用 Program 类型上定义的 doWork 方法,那么你把 static 删除掉了之后自然就会让编译器找不到 doWork方法了(你把通过类型来调用的方法,改成通过对象实例来调用的了)。
  • 打赏
  • 举报
回复
每当“可以写、可以不写static,二者意思不一样,但是在你这里功能结果去完全一样”,那么你就按照自己的理解去写就行了。有的人喜欢写 static(我是这样的),有的人喜欢不声明为static 的,都是可以的。 注意一点,软件一定是经常重构的。当你必须的时候(此时你的理论首先发生了变化),你再修改,以测试为准而不是以理论为准,就 OK 了。
正怒月神 2017-01-26
  • 打赏
  • 举报
回复
第一个问题,有没有都可以。 第二个问题,static void Main 为何调用的是 static 方法 。 因为 静态方法不能访问非静态方法和变量

110,533

社区成员

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

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

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