目录
一般来说,this 仅仅局限于对象内部,对象外部是无法看到的,这就是this的基本思想,在我们的项目开发中,this关键字用的并不多,这也导致有些程序员对它的认识就不充足,有些知识点就会错过,this的功能绝对不是网上一些课程讲的那样,只是用来区分全局变量和局部变量,下面我就介绍 this 的几种用法,必定能让你对这个关键字有一个全新的认识。
这个是常用的功能,如下图,熟悉的可以直接跳过,假设当前类有一个全局变量和当前方法中的参数名一模一样的时候,Visual Studio 就会提示异常,因为系统不知道你到底要给谁赋值,按 C# 的编程规范来说,全局变量最好第一个字母用大写,当然你也可以用小写,在遇到下面的这种情况时,只要前面加一个 this,系统就知道左边的 name 是当前类的成员,而右边的 name 则是方法的参数。


这时的 this 我们看到是一个正常的蓝色,如果不需要用到 this 关键字,那么 this 字体则是灰色的。
如果其他类的参数类型和当前类一致,直接写 this 即可
public class Test1
{
public void MyTest(Test2 test2)
{
Console.WriteLine(test2.Name);
}
}
public class Test2
{
public string Name = "厚礼蟹";
public void MyTest()
{
new Test1().MyTest(this);
}
}
调用 Test2.MyTest() 就会输出:厚礼蟹
作为索引器,在平时的项目中用的并不多,但在微软给我们封装好的方法中,用的特别多,我们常用的数组,List 等,基本都是使用索引器去读取的。
namespace 计算3
{
public class Program
{
static void Main(string[] args)
{
Test1 test1 = new Test1();
Console.WriteLine(test1[1]);
Console.ReadKey();
}
}
public class Test1
{
string[] NameList = new string[3] { "张三", "李四", "王五" };
public string this[int index]
{
get
{
if(index < 0 || index >= NameList.Length)
{
Console.WriteLine("index 的值超过了数组的范围");
return null;
}
return NameList[index];
}
}
}
}
执行后,会输出:李四
在实例化当前的类的时候,不仅仅是调用一个构造函数,用 this 就可以调用其他的构造函数,甚至在调用的时候,还可以执行其他的属性,字段,调用其他的方法,这些都是没问题的。
namespace 计算3
{
public class Program
{
static void Main(string[] args)
{
Test1 test1 = new Test1("王五");
Console.ReadKey();
}
}
public class Test1
{
public static int GetAge
{
get => 4;
}
public Test1()
{
}
public Test1(string name, int age)
{
Console.WriteLine("姓名:" + name);
Console.WriteLine("年龄:" + age);
}
public Test1(string name) : this(name, GetAge)
{
}
}
}
可以看到,这里的写法和 base 关键字类似,不过 base 是调用父类的构造函数。
执行后输出:
姓名:王五
年龄:4
扩展方法的核心三要素是静态类,静态方法,和this参数。
既在静态类中定义的静态方法,该方法的第一个参数带this
namespace 计算3
{
public class Program
{
static void Main(string[] args)
{
string name = "233";
name.TestString();
int age = 3;
age.TestInt();
Console.ReadKey();
}
}
public static class Espandi
{
public static void TestString(this string s)
{
Console.WriteLine("这是 string 的扩展方法:" + s);
}
public static void TestInt(this int t)
{
Console.WriteLine("这是 int 的扩展方法:" + t);
}
}
}
在上面的 TestString 方法中,参数前面加 this ,可以理解为 给 string 类 添加了一个 静态方法 TestString,那么我们可以在其他的类中使用 string 类型变量直接调用这个方法了,而不需要使用 Espandi.TestString() 这种方式调用。
输出

如果这个帖子对你有用,欢迎 关注 + 点赞 + 留言,谢谢
end
在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中
在尝试实现应用auto_orient的过程之后!对于我的图片,我收到此错误:ArgumentError(noimagesinthisimagelist):app/uploaders/image_uploader.rb:36:in`fix_exif_rotation'app/controllers/posts_controller.rb:12:in`create'Carrierwave在没有进程的情况下工作正常,但在添加进程后尝试上传图像时抛出错误。流程如下:process:fix_exif_rotationdeffix_exif_rotationmanipulate!do|image|
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
我是Ruby和RubyonRails世界的新手。我已经阅读了一些指南,但我在使用以下语法时遇到了一些麻烦。我认为在Ruby中使用:condition语法来定义具有某种访问器的类属性,例如:classSampleattr_accessor:conditionend隐式声明“条件”属性的getter和setter。当我查看一些Rails示例代码时,我发现以下示例我并不完全理解。例如:@post=Post.find(params[:id])为什么它使用这种语法访问id属性,而不是:@post=Post.find(params[id])或者,例如:@posts=Post.find(:all):
我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>
我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme
目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans
我在通过RubyMineIDE进行远程调试时遇到以下错误。$bundleexecrdebug-ide--port1234--script/railsserverFastDebugger(ruby-debug-ide0.4.9)listenson:1234/home/amit/.rvm/gems/ruby-1.9.3-p125/gems/ruby-debug-ide19-0.4.12/lib/ruby-debug-ide.rb:123:in`debug_load'/home/amit/.rvm/gems/ruby-1.9.3-p125/gems/ruby-debug-ide19-0.4.
我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=
我是Ruby的新手,发现以下几对令人困惑示例同样有效:File.included_modulesFile::included_modulesFile.stat('mbox')#Returnsa'#'objectFile::stat('mbox')File.new("foo.txt","w")File::new("foo.txt","w")"asdf".size#Aninstancemethod"asdf"::size2+32::send(:+,3)#AnextremeexampleFile::new,尤其是我经常遇到的东西。我的问题:如果我永远避免使用::运算符来限定除类、模块和常量之