Archive for the .Net Category

Re: Math.ceil方法在java和c#中可能出现不同结果

本质是double强制转换成int导致的问题

测试代码
using System;

namespace Test.Basic.Math
{
    public class Abs
    {
        public static void Main()
        {
           
Console.WriteLine((int)System.Math.Abs(System.Math.Ceiling(-1 / 0d)));
           
Console.WriteLine((float)System.Math.Abs(System.Math.Ceiling(-1 / 0d)));
           
            double a=-1.7976931348623157E+308;
            int max=int.MaxValue;
            int min=int.MinValue;
            Console.WriteLine((int)a);
            Console.WriteLine("min-1="+(min-1));
            Console.WriteLine("max+1="+(max+1));
           
//            checked
//            {
//                Console.WriteLine((int)a);
//                Console.WriteLine("min-1="+(min-1));
//                Console.WriteLine("max+1="+(max+1));               
//            }
            Console.WriteLine("min-1="+Convert.ToUInt32(min-1));
            Console.WriteLine("max+1="+Convert.ToInt32(max+1));
            Console.ReadLine();
        }
    }
}

提供下面的Ceil方法
MathUtils
        public static int Ceil(double d){
            d=Math.Ceiling(d);
            if(d>int.MaxValue){
                return int.MaxValue;
            }
            if(d<int.MinValue){
                return int.MinValue;
            }
            return(int)d;
        }

Math.ceil方法在java和c#中可能出现不同结果

double l=1;
double j=0;

int i=Math.ceil(l.j);//java中得到最大整数,2……

int l = System.Math.Ceiling(l/j);//C#中得到一个负的最小整数-2……,取
绝对值就相同了

What is the difference between using IDisposable vs a destructor in C#?

析构函数是GC自动调用的

IDisposable需要自己去调用,或者在using{}中自动调用,如下写法保证sr资源释放:

C#中一个类继承多个接口,各个接口包含相同函数名情况下,需要在函数名前指定所继承的接口名

//因为System.Collections.Generic.ICollection<System.Object>既继承了System.Collections.IEnumerable
继承了
System.Collections.Generic.IEnumerable<Object>
以要实现两个
GetEnumerator()方法,分别指定接口名

    public class YList :
System.Collections.Generic.ICollection<System.Object>
    {
       …
        System.Collections.Generic.IEnumerator<Object> System.Collections.Generic.IEnumerable<Object>.GetEnumerator(){
            return Cursors.createIterator(cursor());
        }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){
            return Cursors.createIterator(cursor());
        }

SharpDevelop 小巧的.net IDE ,十几兆,用起来感觉不错,省去安装庞大的VS2008

小巧的.net IDE ,十几兆,用起来感觉不错,省去安装庞大的VS2008
支持多种语言,单元测试

http://www.icsharpcode.net/OpenSource/SD/

无缝兼容vs工程,单元测试,
测试代码覆盖,
关联.net Reflector很方便,唯一的遗憾就是不支持silverlight





与java不同,C#的Point居然是值传递,因为是struct类型

Java转到C#需要注意值传递的问题,struct类型都是值传递,原来用java对点作矩形变换的代码转到C#时需要处理一下

object string struct 默认都是值传递,设置ref的例外

System.Drawing.Point
System.Drawing.PointF

C#的Point居然是值传递,因为是struct类型

测试代码:
transform.cs

using System;

namespace test2
{
    public class Element
    {

        static void Main(string[] args)
        {
            System.Drawing.Drawing2D.Matrix at = new
System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, 0, 0);
            at.Rotate((float)(System.Math.PI / 2 * (180 /
System.Math.PI)));
            System.Drawing.PointF p1 = new
System.Drawing.PointF(100,200);
            System.Drawing.PointF[] points = new
System.Drawing.PointF[] { p1 };
            at.TransformVectors(points);
            Console.WriteLine(points[0]);//这个值变化了
{X=-200, Y=100}
            Console.WriteLine(p1);//这个不变化
{X=100, Y=200}
        }

    }
}