精华内容
下载资源
问答
  • 许久关注手机产品,对里面的一些参数都有些陌生了,整理一下记录下来,也算给自己科普。1 1. 磁悬发声技术 磁悬屏幕发声,告别物理听筒 华为P30 Pro搭载磁悬发声屏,手机屏幕即为听筒,无需在中框开孔,可以实现...

    9月19日,华为2019年度旗舰Mate30系列手机在德国慕尼黑正式发布。

    许久不关注手机产品,对里面的一些参数都有些陌生了,整理一下记录下来,也算给自己科普。1

    1. 磁悬发声技术

    磁悬屏幕发声,告别物理听筒 华为P30 Pro搭载磁悬发声屏,手机屏幕即为听筒,无需在中框开孔,可以实现超窄边框。通话声音由屏幕振动产生,与此同时,屏幕振动还将声音通过骨传导传递到耳朵。传统听筒是通过音膜推动前后空气发声,而屏幕发声技术是通过屏幕振动推动屏幕前后空气发声。

     

    总结一下屏幕发声的优势:

    ①屏幕不开孔,优化整机防尘防水设计;

    ② 屏幕无听筒开孔,呈现出更完美的全面屏设计;

    ③ 利用整个屏幕发声,还原听筒的通话质感。

    ④ 拥有超大的聆听区域,听音面积更广,同时声音聚焦屏幕中心

     

    (iphone 三个孔:摄像头 光学感应孔 距离感应孔)

    2. 取消实体按键,侧边双击音量调节。

    3. 1080P分辨率的OLED屏幕

    1080p是一种视频显示格式,外语字母P意为逐行扫描(Progressive scan),有别于1080i的隔行扫描(interlaced scan)。数字1080则表示垂直方向有1080条水平扫描线。通常1080p的画面分辨率为1920×1080。数字1080则表示垂直方向有1080条水平扫描线。

    1080是全高清 1920*1080,2K是2560*1440 是720P(分辨率是1280 X 720)的4倍,4K是3840*2160 是1080P的4倍。

    Mate30 pro多了侧边显示,分辨率略高

    4. Mate30 支持IP57级别防尘防水,Pro达到了IP68级别

    IP后面跟了2位数字,第1个是固态防护等级,范围是0-6,分别表示对从大颗粒异物到灰尘的防护;第2个是液态防护等级,范围是0-8,分别表示对从垂直水滴到水底压力情况下的防护。数字越大表示能力越强。

     

    5. 全新990芯片,7纳米EUV级紫外光刻工艺

    6. 5G NSA&SA SoC

    NSA(非独立组网)和SA(独立组网)是全球通行的两种5G组网模式。从技术的发展来看,NSA技术要更成熟一些,已在全球多个国家实现商用,而SA尚处于实验阶段;从网络覆盖来说,NSA可以实现大面积覆盖,SA则需要完全重新建立,需要一些时间才能实现完全覆盖;从技术标准来说,NSA是最终的商用技术标准,SA尚未确认;从5G发展的趋势来看,目前部署5G的国家,几乎都是NSA先行,并在此基础上逐渐实现SA。

    截止今年5月,全球推出的50多款5G终端中,大多是NSA单模;NSA手机不可以更换或升级为SA,但不影响在NSA 5G网络下正常使用。

     

    在NSA组网下,终端双连接LTE(LTE(Long Term Evolution,长期演进))和NR(5G New Radio)两种无线接入技术;在SA组网下,终端仅连接NR一种无线接入技术。

    目前4g网络主要有两种模式,TD-LTE 和FDD-LTE。中国移动发展的是TD-LTE ,联通和电信使用FDD-LTE。所以手机上大都以LTE 表示4g网络。

     

    7. 5G NR包含了部分LTE 频段,也新增了一些频段(n50、n51、n70及以上)。目前,全球最有可能优先部署的5G频段为n77、n78、n79、n257、n258和n260,就是3.3GHz-4.2GHz、 4.4GHz-5.0GHz和毫米波频段26GHz/28GHz/39GHz。

     

    8. 双卡,双卡槽全部支持5G

    9. 石墨烯散热,通话温度降低快

    10. 最大4500毫安电池,反向无线充电,40W有线充电和27W无线充电

    11. Mate30:广角、超广角、长焦的三摄系统,20480的ISO,45倍光学变焦/光学和电子防抖

    Mate 30 pro 四摄系统,全新双主摄1/1.45英寸3:2分辨率RGGB大底和1/1.7英寸RYYB CMOS ISO高达409600,45倍变焦

     

    科普:长焦镜头类似在手机上加了一个望远镜,让手机可以拍到更远的地方。相比主摄以及其他镜头,在拍摄远景能得到更清晰的画面。在我们放到取景框画面的手机会自动调用长焦镜头。

    长焦端可以拥有好的背景虚化效果,用长焦端拍摄,背景虚化效果更强。所以有些品牌手机在拍摄人像作品的时候会调用长焦镜头。

    超广角镜头可以带来更宽广的视角/超广角镜头会带来画面畸形问题/超广角近大远小的畸变原理/

    标准镜头是指焦距在40至55毫米之间的镜头。从标准镜头中观察的画面与人眼看见的画面十分接近,它是所有镜头中最基本的一种摄影镜头。/广角镜头的焦距比标准镜头短,分别有焦距38-24毫米,视角60-84度的普通广角和焦距20-13毫米,视角94-118度的超广角两种镜头。广角镜头适合拍摄距离近且景物大的照片,拍摄的画面比人眼所见要大得多。此外,广角镜头的画面强调前景且突出远近对比,也就是说,画面中近的东西更大,远的东西更小,有强烈的透视效果。/长焦镜头的焦距比标准镜头的长,分为85毫米-300毫米的普通远摄镜头和300毫米以上的超远摄镜头两种。主要用于拍摄远处的对象,能有效虚化背景突出主体。

    感光度,又称为ISO值,是衡量底片对于光的灵敏程度,由敏感度测量学及测量数个数值来决定,感光度(ISO值)是来自胶片时代摄影的一个概念,国际标准化组织ISO(International Organization for Standardization)制定了胶片对光线的化学反应速度标准。

     

    摄像头应该算是物理结构最为复杂的元件之一,它通常都是由PCB主板、CMOS传感器(SENSOR)、固定器(HOLDER)和镜头(LENS ASS′Y)构成。

    把传统绿像素换成黄像素就是利用了黄色像素光波波长更长,更适合暗光环境下摄入光源成像,缺点就是在图像成像端YB像素需要先组合成青像素才能构图,对于算力要求更高,步骤更繁琐。(Pro 两个大底的好处?)

    智能手机想要缩短与专业相机之间的差距,只有不断提升CMOS成像画质这么一条出路。比如,增加CMOS传感器尺寸,获得“底大一级压死人”的先天优势。(使用1/1.45 1/1.7大底?)

    再比如,提升CMOS传感器的进光量,从而具备捕捉更多光线的能力,这样就能在同样环境下,拍摄出亮度更高、噪点更少、更清晰的照片。对CMOS而言,提升进光量的手段有很多,增加传感器尺寸、增大镜头光圈、增加单个像素感光面积、引入UltraPixel超像素摄像头(如HTC One M7)等都是可行的手段

     

    拜耳阵列/反拜耳运算

    拜耳阵列”之所以流行,是因为它是公认的最佳CMOS结构。但是,随着手机内置ISP单元性能的提升和各种成像算法的不断优化,给了优化CMOS结构的空间。于是,我们就看到了所谓的“RGBW”、“RWWB”和“RYYB” 等CMOS结构。

    由于人眼对绿色敏感度最高,所以拜耳才会在每个RGBG阵列中用上2个绿色像素(G)。此时,如果我们将其中一个绿色像素(G)换成透光性更强的白色像素(W),组成所谓的“RGBW”

    既然RGBW已经“抠掉”了一个绿色像素替换成白色像素,那何不更进一步,将另外一个绿色像素也换成白色呢?同样是2015年,联发科在发布曦力Helio P10时就曾主打一项名为“True Bright”的图像引擎,其主要的构成部分就是采用“RWWB”结构的CMOS传感器,将传统拜耳阵列上的两个绿色像素全部替换为白色,进光量比RGBW结构还要大

    虽然联发科提倡的RWWB CMOS一直停留在纸面阶段,但这并不妨碍大家拿来借鉴参考。既然RWWB已经将2个绿色像素点给替换了,那为何不干脆彻底丢掉分色滤镜,让CMOS实现光线全透呢?于是,索尼就第一家推出了专业的IMX Mono黑白摄像头,拥有极高的进光量,可以记录暗光环境下的更多细节。 纯黑白+双摄

    和RGGB相比,RYYB可以减轻前者在滤色过程中所带来的光之强度折损,可以让进光量提升高达40%。以华为P30 Pro为例,该产品的ISO高达409600

    黄色是可以由红色+蓝色得来(R+G=Y),即黄色是绿色和红色的结合,在亮度上是两者的叠加。将三原色重塑后,RYYB CMOS在色彩原理上就将与RGGB产生根本性变化——RGGB光学三原色是加色法,表现的是吸收的光(绿色通道吸收绿光),R+G+B是白色,即吸收了一切光;RYB三原色是减色法,表现的是反射的光(黄色反射了红光和绿光),R+Y+B是黑色,即反射了一切光。YYB滤镜虽然可以提升进光量,但其本质却是变相增加了红色的进光量,从而提升了弱光环境下的表现。同时,由于黄色像素较多,偏色问题将难以避免,同时绿色像素的缺失也会影响饱和度。

    13. EMUI10系统 暗色模式/息屏模式

      

    EMUI10基于安卓系统开发,加入了暗黑模式,并带来了多彩的AOD灭屏显示和升级的杂志锁屏,还引入莫兰迪风格的6种颜色。还有黄金比例图标、全新相机体验、深色模式、流畅动效等等, EMUI10从系统底层打通了Windows和Android的藩篱,实现了PC和手机的无缝协同,PC的键盘、鼠标成为手机的外设。EMUI10采用了3大关键分布式技术,采用分布式UI编程框架,实现应用界面多端自适应。

    14. 手势隔空操作

    15. 眼球追追踪防窥屏/调节屏幕旋转

    16. 屏下指纹/3D结构光面部解锁

    屏下指纹识别技术,也叫隐形指纹技术。是通过屏幕玻璃下方完成指纹识别解锁过程的新技术,主要利用超声波、光学等穿透技术,可以穿透各种不同的材质,从而达到识别指纹的目的。

    1)光学式指纹识别技术

    光学技术顾名思义,肯定和光有关系。它的原理就是下面这张图。

    简单讲,手指按在指纹采集器上后,内部的光源将光线打到手指上,经过手指反射后汇集到识别器上,获得指纹图像。

    2)超声波技术

    超声波屏下指纹识别,就是在屏幕下方设置超声波传感器,通过超声波完成指纹识别工作,原理图如下。

    超声波指纹识别的安全性更高,湿手也能解锁,但目前还不成熟,比如超声波传感器体积大,识别速度慢,穿透力不够强等问题。

    https://baijiahao.baidu.com/s?id=1589614259551547519&wfr=spider&for=pc

     

    1. 3D结构光

     

    原理示意 3D结构光的整个系统包含结构光投影设备、摄像机、图像采集和处理系统。其过程就是投影设备发射光线到被测物体上,摄像机拍摄在被测物体上形成的三维光图形,拍摄图像经采集处理系统处理后获得被测物体表面数据。在这个系统中,当相机和投影设备相对位置一定时,投射在被测物体上的光线畸变程度取决于物体表面的深度,所以在拍摄图像中可以得到一张拥有深度的光线图像。

     

    苹果首次在iPhone X上采用了面部识别技术,这是一套强大、安全的验证系统,通过它可以进行设备解锁或支付。Face ID得以实现主要依赖于苹果的原深感摄像头系统,这个系统主要包括红外镜头、泛光感应元件、点阵投影器等几项技术,通过实时协作对脸部的精细深度图识别。

    其中,点阵投影器通过将30000多个肉眼不可见的光点投影在人的脸部,绘制成独一无二的面谱;红外镜头则读取点阵图案,捕捉它的红外图像,然后将数据发送至A11仿生这款芯片中的安全隔区,以确认是否匹配;泛感光元件加持,通过借助不可见的红外光线,实现黑暗中也可以顺利刷脸。

    安卓阵营

    这里就要以小米8探索版为例了。其3D结构光的工作原理与苹果的Face ID大同小异,主要由红外相机、泛光照明元件、点阵投影器等组成的3D结构光系统运行。

    不同的是小米8探索版的点阵投射器投放了33000个红外点去构建3D人脸模型。看上去是不是比苹果要腻害?然鹅,尽管投射点多,但在数据采集和3D建模方面还是达不到苹果Face ID的精确级别。

    再来看看OPPO Find X的O-Face技术。主要是由IR补光灯、IR摄像头、点阵投影器等3D结构光系统实现。通过向人脸投射15000个光点,建立毫米级精度的3D深度图,实现信息对比并完成解锁。

     

    红外人脸识别

     

    红外人脸识别解锁相对于3D结构光来说,还停留在2D层面。红外人脸识别的工作原理是通过红外投射后,记住人脸的一些关键点,构建2D人脸模型,这种识别只需几个关键点核对无误就可解开,相比3D结构光的上万个阵点,安全系数低太多。早期一张照片都能破解,后面虽然增加了判定活物与否的辅助技术,但还是容易破解。而且受环境影响非常大,光线昏暗的地方识别成功率就大大降低了

     

    AI人脸解锁

     

    相信大家对AI并不陌生,AI就是人工通过模拟人的意识、思维。通过像人那样去思考,来进行信息识别和记忆。所以AI人脸解锁是通过数以亿计次的计算算法来熟悉并记住人的脸部特征,详细记录手机使用者的日常行为习惯来分析你是不是手机的主人。

     

     

    展开全文
  • 它们的第一个参数指定该方法作用于哪个类型,并且该参数以  this  修饰符为前缀。   仅当你使用  using  指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。 下面的示例演示为  System . ...

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

    最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable<T> 类型。 若要使用标准查询运算符,请先使用 using System.Linq 指令将它们置于范围中。 然后,任何实现了 IEnumerable<T> 的类型看起来都具有 GroupByOrderByAverage 等实例方法。 在 IEnumerable<T>类型的实例(如 List<T> 或 Array)后键入“dot”时,可以在 IntelliSense 语句完成中看到这些附加方法。

    下面的示例演示如何对一个整数数组调用标准查询运算符 OrderBy 方法。 括号里面的表达式是一个 lambda 表达式。 很多标准查询运算符采用 lambda 表达式作为参数,但这不是扩展方法的必要条件。 有关详细信息,请参阅 Lambda 表达式(C# 编程指南)

    C#
    class ExtensionMethods2    
    {
    
        static void Main()
        {            
            int[] ints = { 10, 45, 15, 39, 21, 26 };
            var result = ints.OrderBy(g => g);
            foreach (var i in result)
            {
                System.Console.Write(i + " ");
            }           
        }        
    }
    //Output: 10 15 21 26 39 45
    
    
    

    扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

    下面的示例演示为 System.String 类定义的一个扩展方法。 请注意,它是在非嵌套的、非泛型静态类内部定义的:

    C#
    namespace ExtensionMethods
    {
        public static class MyExtensions
        {
            public static int WordCount(this String str)
            {
                return str.Split(new char[] { ' ', '.', '?' }, 
                                 StringSplitOptions.RemoveEmptyEntries).Length;
            }
        }   
    }
    
    
    

    可使用此 using 指令将 WordCount 扩展方法置于范围中:

    using ExtensionMethods;
    

    而且,可以使用以下语法从应用程序中调用该扩展方法:

    string s = "Hello Extension Methods";
    int i = s.WordCount();
    

    在代码中,可以使用实例方法语法调用该扩展方法。 但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。 因此,并未真正违反封装原则。 实际上,扩展方法无法访问它们所扩展的类型中的私有变量。

    有关详细信息,请参阅如何:实现和调用自定义扩展方法(C# 编程指南)

    通常,你更多时候是调用扩展方法而不是实现你自己的扩展方法。 由于扩展方法是使用实例方法语法调用的,因此不需要任何特殊知识即可从客户端代码中使用它们。 若要为特定类型启用扩展方法,只需为在其中定义这些方法的命名空间添加 using 指令。 例如,若要使用标准查询运算符,请将此 using 指令添加到代码中:

    using System.Linq;
    

    (你可能还必须添加对 System.Core.dll 的引用。)你将注意到,标准查询运算符现在作为可供大多数 IEnumerable<T> 类型使用的附加方法显示在 IntelliSense 中。

    说明说明

    尽管标准查询运算符没有显示在 String 的 IntelliSense 中,但它们仍然可用。

    可以使用扩展方法来扩展类或接口,但不能重写扩展方法。 与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。 编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。 换句话说,如果某个类型具有一个名为 Process(int i) 的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。 当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。 如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。 下面的示例演示编译器如何确定要绑定到哪个扩展方法或实例方法。

    下面的示例演示 C# 编译器在确定是将方法调用绑定到类型上的实例方法还是绑定到扩展方法时所遵循的规则。 静态类 Extensions 包含为任何实现了 IMyInterface 的类型定义的扩展方法。 类 AB 和 C 都实现了该接口。

    MethodB 扩展方法永远不会被调用,因为它的名称和签名与这些类已经实现的方法完全匹配。

    如果编译器找不到具有匹配签名的实例方法,它会绑定到匹配的扩展方法(如果存在这样的方法)。

    C#
    // Define an interface named IMyInterface.
    namespace DefineIMyInterface
    {
        using System;
    
        public interface IMyInterface
        {
            // Any class that implements IMyInterface must define a method
            // that matches the following signature.
            void MethodB();
        }
    }
    
    
    // Define extension methods for IMyInterface.
    namespace Extensions
    {
        using System;
        using DefineIMyInterface;
    
        // The following extension methods can be accessed by instances of any 
        // class that implements IMyInterface.
        public static class Extension
        {
            public static void MethodA(this IMyInterface myInterface, int i)
            {
                Console.WriteLine
                    ("Extension.MethodA(this IMyInterface myInterface, int i)");
            }
    
            public static void MethodA(this IMyInterface myInterface, string s)
            {
                Console.WriteLine
                    ("Extension.MethodA(this IMyInterface myInterface, string s)");
            }
    
            // This method is never called in ExtensionMethodsDemo1, because each 
            // of the three classes A, B, and C implements a method named MethodB
            // that has a matching signature.
            public static void MethodB(this IMyInterface myInterface)
            {
                Console.WriteLine
                    ("Extension.MethodB(this IMyInterface myInterface)");
            }
        }
    }
    
    
    // Define three classes that implement IMyInterface, and then use them to test
    // the extension methods.
    namespace ExtensionMethodsDemo1
    {
        using System;
        using Extensions;
        using DefineIMyInterface;
    
        class A : IMyInterface
        {
            public void MethodB() { Console.WriteLine("A.MethodB()"); }
        }
    
        class B : IMyInterface
        {
            public void MethodB() { Console.WriteLine("B.MethodB()"); }
            public void MethodA(int i) { Console.WriteLine("B.MethodA(int i)"); }
        }
    
        class C : IMyInterface
        {
            public void MethodB() { Console.WriteLine("C.MethodB()"); }
            public void MethodA(object obj)
            {
                Console.WriteLine("C.MethodA(object obj)");
            }
        }
    
        class ExtMethodDemo
        {
            static void Main(string[] args)
            {
                // Declare an instance of class A, class B, and class C.
                A a = new A();
                B b = new B();
                C c = new C();
    
                // For a, b, and c, call the following methods:
                //      -- MethodA with an int argument
                //      -- MethodA with a string argument
                //      -- MethodB with no argument.
    
                // A contains no MethodA, so each call to MethodA resolves to 
                // the extension method that has a matching signature.
                a.MethodA(1);           // Extension.MethodA(object, int)
                a.MethodA("hello");     // Extension.MethodA(object, string)
    
                // A has a method that matches the signature of the following call
                // to MethodB.
                a.MethodB();            // A.MethodB()
    
                // B has methods that match the signatures of the following
                // method calls.
                b.MethodA(1);           // B.MethodA(int)
                b.MethodB();            // B.MethodB()
    
                // B has no matching method for the following call, but 
                // class Extension does.
                b.MethodA("hello");     // Extension.MethodA(object, string)
    
                // C contains an instance method that matches each of the following
                // method calls.
                c.MethodA(1);           // C.MethodA(object)
                c.MethodA("hello");     // C.MethodA(object)
                c.MethodB();            // C.MethodB()
            }
        }
    }
    /* Output:
        Extension.MethodA(this IMyInterface myInterface, int i)
        Extension.MethodA(this IMyInterface myInterface, string s)
        A.MethodB()
        B.MethodA(int i)
        B.MethodB()
        Extension.MethodA(this IMyInterface myInterface, string s)
        C.MethodA(object obj)
        C.MethodA(object obj)
        C.MethodB()
     */
    
    
    

    通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现。 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。 有关详细信息,请参阅继承(C# 编程指南)

    在使用扩展方法来扩展你无法更改其源代码的类型时,你需要承受该类型实现中的更改会导致扩展方法失效的风险。

    如果你确实为给定类型实现了扩展方法,请记住以下几点:

    • 如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。

    • 在命名空间级别将扩展方法置于范围中。 例如,如果你在一个名为 Extensions 的命名空间中具有多个包含扩展方法的静态类,则这些扩展方法将全部由 using Extensions; 指令置于范围中。

    针对已实现的类库,不应为了避免程序集的版本号递增而使用扩展方法。 如果要向你拥有源代码的库中添加重要功能,应遵循适用于程序集版本控制的标准 .NET Framework 准则。 有关详细信息,请参阅程序集版本控制


    展开全文
  • 【C# 教程系列第 4 篇】什么是 c# 中的 ref 参数

    万次阅读 多人点赞 2018-12-20 14:39:23
    一:什么是 ref 参数、 二:使用 ref 的注意事项。

    这是【C# 教程系列第 4 篇】,如果觉得有用的话,欢迎关注专栏。

    写这篇博客之前,本来想把标题写成 “ref参数与out参数的区别”,但想了想还是分开写吧,以免更混淆大家。

    首先,来看一句比较绕嘴的话

    变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上

    该怎么处理呢?

    你们觉得绕口吗?觉得绕口也没关系,因为看完我下面的讲解,你再理解这句话就会容易很多了。

    接着进入文章正题部分

    第一步
    首先,我在控制台上写一个方法,方法的功能就是交换传入的数值,代码如下

        static void TestRef(int a,int b)
        {
            int temp;
            temp = b;
            b = a;
            a = temp;
        }
    

    第二步
    然后在 Main 函数里声明两个 int 类型的变量 x,y,然后调用 TestRef 方法。为做直观的对比,这里我把交换 x,y 前和交换 x,y后都在控制台上打印出来,代码如下

        static void Main(string[] args)
        {
            int x = 10;
            int y = 20;
            Console.WriteLine("交换之前,x={0},y={1}",x,y);
            TestRef(x,y);
            Console.WriteLine("交换之后,x={0},y={1}",x,y);
            Console.ReadKey();
        }
    

    按 F5 启动项目,如下
    在这里插入图片描述
    我们明明调用了可以交换传入数值位置的函数 TestRef,为什么却没有交换 x 和 y 的位置呢?

    原因分析
    首先,函数本身没有问题,问题在于 int 是值类型,它所创建的实例不在托管堆中分配内存,而是直接存储在变量中。虽然我们调用了函数 TestRef,但也不过只是复制了一遍 x,y 的值而已。那我们想在调用完交换函数 TestRef 后,x,y的位置可以交换,该怎么做呢?

    这就要引入关键字 ref

    什么是 ref
    ref (全拼:reference):强制要求参数按引用传值。

    使用 ref 关键字 有两个注意事项,如下

    • 一:传入参数之前,必须给参数赋值。
    • 二:调用方法时,必须加 ref 关键字。

    验证注意事项一:

    现在假如我们不给 x 赋初始值,会有什么问题呢?
    在这里插入图片描述
    验证注意事项二:

    我们在函数 TestRef 里参数类型前面加上 ref 关键字

        static void TestRef(ref int a,ref int b)
        {
            int temp;
            temp = b;
            b = a;
            a = temp;
        }
    

    然后直接调用这个函数会有什么问题呢?
    在这里插入图片描述
    以上两个验证便是使用 ref 关键字需要注意的事项。

    在调用函数里加上ref关键字后
    在这里插入图片描述
    我们再按F5,看有什么不一样的效果
    在这里插入图片描述
    OK。x,y交换位置成功。

    现在再回头看那句绕嘴的话,变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上,现在应该容易理解了吧!

    你的问题得到解决了吗?欢迎在评论区留言。

    赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


    结束语

    技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

    最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
    展开全文
  • 参数列表里的冒号是什么意思?Pyhon冒号在括号里?Python括号里加:冒号是什么意思参数列表里加:冒号?def (context : Context)的冒号是什么意思? 今天群里有位群友问了这样一个问题: 正想回答这位群友,却...

    python冒号有多少用法?冒号除了切片能怎么用?参数列表里的冒号是什么意思?Pyhon冒号在括号里?Python括号里加:冒号是什么意思?参数列表里加:冒号?def (context : Context)的冒号是什么意思?

    今天群里有位群友问了这样一个问题:

    在这里插入图片描述
    在这里插入图片描述

    正想回答这位群友,却突然发现自己不知道这个‘:’的官方叫法。

    查阅过Python文档之后,得到了答案:

    在这里插入图片描述
    在这里简单记录一下:

    这个冒号的用法: Type Hints
    是Python 3.5/ PEP 484才加入的新特性;
    国内通常叫做类型提示。

    在这里插入图片描述
    如图,就是一个简单的例子。str标注的是形参数据类型,-> str 提示的是返回值数据类型。

    在这里插入图片描述

    目的如下:

    此PEP旨在为类型注释提供标准语法,为Python代码提供更容易的静态分析和重构、潜在的运行时类型检查,以及(可能在某些上下文中)利用类型信息生成代码。

    非目的:

    还应该强调的是,Python仍然是一种动态类型语言,而且即使按照惯例,作者也不希望强制使用类型提示。

    注:话里话外的意思是,编译器并不会针对这个:专门进行优化,也就是不会因为这个冒号就变成了强数据类型,传入数据类型不是提示类型的时候也不会针对性的报错。

    简单来说,对于初学者,当作注释看就行了。

    如果您有扎实的基础,根据官方文档的提示,可以使用get_type_hints()和一些第三方模块来实现一些有创造力的想法。

    展开全文
  • 什么是命令行参数

    万次阅读 2018-04-15 16:29:55
    摘自《OpenCV 入门教程》 于仕琪 shiqi.yu@szu.edu.cnC/C++语言中的 main 函数,经常带有参数 argc,argv,如下:int main(int argc, char** argv)或者int main(int argc, char* argv[])在上面代码中,argc 表示...
  • 什么是参数

    千次阅读 2018-12-05 21:20:42
    在机器学习的中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。 要而言之,我们可以根据实际...
  • 百度url参数分别代表什么意思?

    千次阅读 2014-05-20 11:08:50
    百度url参数分别代表什么意思? 示例(链接已取消):http://www.baidu.com/s?bs=%B6%AB%DD%B8%B8%D6%BD%E1%B9%B9&f=8&rsv_bp=1&rsv_spt=3&wd=%B6%AB%DD%B8%D6%D0%C8%FC%B8%D6%BD%E1%B9%B9&inputT=3250 一:?...
  • 后来我们发现没有使用“_”的请求头都能正常传递,所以我们修改自定义请求头为“authuserid”(也就是去掉下划线),最终应用成功获取到了自定义的请求头。 那么,服务器为何要对字段名中使用了下划线的请求头视若...
  • 系统错误null是什么意思 Java中NULL用法的简单示例: public Employee getByName(String name) { int id = database.find(name); if (id == 0) { return null; } return new Employee(id); } 这种方法有什么...
  • 微信扫码登录redirect_uri参数什么

    千次阅读 2020-07-08 16:54:36
    微信扫码登录过程中所遇到的问题 ...自己找了很多文章方法,其中大多是检查微信回调域名,看看是否加了http://,但是我觉得很多人应该是和我一样的,并没有报错,而且并知道参数应该什么,怎么写,这个时候可以尝试
  • steps函数--参数意思和用法

    千次阅读 2019-07-30 17:11:18
    图片解释如下,参数意思和用法在代码的注释中 所引用图片共7帧,如下: 尺寸为200*1400,所以设置div为200*200,分为7帧,除去展示帧,需六次步骤跳转,原图如下: 代码: 参数如果是start,就是在开始的时候改变,...
  • 缺省是什么意思

    千次阅读 多人点赞 2020-06-27 08:50:47
    “缺省”最初来源于计算机英文文档中的单词"default","default”有很多意思:违约、缺省、拖欠、默认,由于当时计算机方面的翻译水平高,于是就把这个词直译成了“缺省”,其实应该取它的引申意思“默认”。...
  • URL是什么意思 ? URL介绍

    万次阅读 多人点赞 2020-01-09 20:14:18
    前言 Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL(Uniform Resource Locator, 统一资源定位器)。...URL它具有全球唯一性,正确的URL应该是可以通过浏览器打开此网页的,但如果您访...
  • BitmapFactory.decodeResource(?,?)这个带两个参数的方法:第一个参数是包含你要加载的位图资源文件的对象(一般写成 getResources()就...第三个参数应该是对你要加载的位图是否需要完整显示,如果你只需要部分
  • 函数参数中的3个点表示什么

    千次阅读 2018-10-12 16:42:42
    这种函数被称作“具有变长度参数表的函数”,或简称为“变参数函数”。我们写程序中有时也可能需要定义这种函数。要定义这类函数,就必须使用标准头文件&lt;stdarg.h&gt;,使用该文件提供的一套机制,并需要...
  • 一些小的细节,如果注意,一...猜测是数据类型导致的,应该传入时被识别成了str类型的参数,所以会走true的分支。 使用bool(run_type) 转出来 还是true。 因为 bool()方法 传入 字符串 仍为true。 解决方法 使用 s...
  • 出现如下JSON参数不合法的错误: 这是由于在使用短信模板时,我们设置了变量名,在json对象中,要以模板中的变量名为键名,对象的值为模板中的值。当我们提供的变量名与模板一致时,就会导致如上错误。 解决...
  • 相信至今还是有不少朋友知道PT下载的意思。今天小编就给大家带来一篇小小的PT科普篇,告诉大家什么是PT。因为是PT是小众行业,所以本文也会进行一些适当的举例说明,目的是为了让给大家更好的理解PT下载是什么意思...
  • 什么说令人头疼呢?因为解释起来与会花费很多的时间。 1.先介绍下摄像机成像原理  一个摄像机可以大致分为三个部分:镜头 、感光元件(CCD和CMOS)、处理电路。当光线透过镜头,会在感光元件上形成一个物体的...
  • 本篇文章主要讲的是JavaScript中最正常不过的现象——函数参数传递,本篇文章篇幅长,但一定能引发属于你自己的思考!
  • N/A,NG,NV是什么意思

    千次阅读 2020-09-16 10:14:32
    N/A,NG是什么意思 参考链接:https://blog.csdn.net/Dontla/article/details/104019979/ 在计算机书上经常会看到 N/A,那么它的含义是什么呢? 写英文报告常会用到N/A,还有NG,它们的英语全称是什么啊??? N/A : ...
  • 静态IP是什么意思?如何上网?

    千次阅读 2021-02-21 13:56:44
    如果电脑与宽带直接连接,需要将运营商提供的固定IP地址等参数手动填写在电脑上,才可以正常上网。 静态IP上网方式在家庭环境中相对较少,常见的静态IP类型宽带主要为企业、校园内部网络等环境。 简而言之,静态IP是...
  • 概述 JS中=>是箭头函数,是ES6标准中新增的一种...箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它能用作构造函数。 基础语法 (param1, param2, …, paramN) => { statements } (param1, param...
  • 请求“参数”不对bug

    千次阅读 2016-11-16 21:30:56
    多次确认后还是无问题,很头痛,最终发现是在另一个请求的地方写错了请求地址(实际上是自己封装的和手表通信,请求的一个path,也相当于网络请求的url)参数肯定是一样的。 遇到类似bug的时候,比如真正应该请求...
  • 场景:早上上班起本地之后,登录时一直提示验证码错误 / 参数为空或者合法(另一个相同登录原理的项目)。 并且只有我mac 版的Chrome浏览器有问题,Safari都可以正常登录。另一台台式机的Windows的Chrome也可以...
  • 淘宝请求参数spm是做什么用的

    千次阅读 2015-03-26 16:01:28
    频道ID为1(c=1),页面ID为2(d=2),那么spm=2014.123456789.1.2,就唯一标识外站123456789的频道1上的页面2,从这个页面点击出去的链接,后面都应该携带spm=2014.123456789.1.2的参数串。这样,通过这个编码,...
  • 晶体管的h参数、y参数和S参数

    万次阅读 2018-07-25 18:35:02
    同样一只晶体管,用于低频小信号放大器,例如收音机前置低放时,通常选用h参数进行电路设计,而用于高频小信号放大器,例如收音机中放时,则一般要选用y参数进行电路设计,那么,什么是h参数和y参数呢?...
  • -------------------------应对方法--------------------------------------------------------------------- 一般开发,肯定是在前台有两个输入框,一个用户名,一个密码,会在后台里,读取前台传入的这两个参数,...
  • PID参数什么作用

    千次阅读 2020-07-14 17:58:20
    PID控制中有P、I、D三个参数,只有明白这三个参数的含义和作用才能完成控制器PID参数整定,让控制器到达最佳控制效果。昌晖仪表在本文给大家介绍PID控制中P、I、D参数的作用。 比例作用 比例控制器实际上就是个放大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 536,290
精华内容 214,516
关键字:

参数不正常是什么意思