“mThis”的起源是什么?

问题描述:

我们的应用程序的Android部分有一些开发人员积极使用带有“m *”的类成员变量的前缀。“mThis”的起源是什么?

什么是 “mThis”,这是基本的由来:

class SomeClass { 
    private final SomeClass mThis; 
    SomeClass() { 
     mthis = this; 
    } 
} 

和这个符号有什么看法?

+0

该代码没有多大意义;它的唯一好处(AFAIK)稍微简化了从非静态内部类访问封闭类成员的语法。 –

其实我猜这个问题更多的是关于m-prefix,而不是将this作为你自己的领域。

所以,关于前缀,这是a coding convention used by android team:所有成员变量(又名字段)前缀为“m”。基本上就是这样。其他的android开发者可能会使用它,因为他们浏览过android源代码,并认为它适合在自己的代码中使用这个约定。

顺便说一句,它在一般的java编程中并不常见,我相信常见的java编码标准通常不鼓励使用任何类型的前缀。

+0

谢谢,我也想知道“m”代表什么 – mihail

+0

是的,这更多的是他们使用的约定。它是否与c有关? –

+0

本文是关于Android项目源代码的,那么为什么开发人员在应用程序开发中使用相同的代码约定? –

我认为它很方便,当你需要传递一个内部类的实例引用,并且你不想使用“完全限定”这个。即SomeClass.this。尽管如此,对我来说似乎是多余的。

+0

所有其他m-前缀的成员变量是什么? –

我使用m前缀为类实例定义全局变量。我不知道为什么,但是当我开始查看其他android代码时,就是这样。

+1

你的意思是静态的吗? –

+0

-1不是全球性的 - 你的意思是成员函数? – Elemental

+0

“类实例的全局变量” - 不是成员函数,而是成员。 – mihail

This article suggests it comes from ancient habits peculiar to the Microsoft ecosystem - 但是,前缀的struct小号成员与它包含在struct的一些速记是从天Ç习惯时标识符,所有标识符(包括结构成员的名字),不得不在前八个字符中是唯一的。与包含结构的名称的简写版的前缀名称是一种简单的机制来确保唯一的名字:

struct inode { 
    int number; 
    struct device *dev; 
} 

struct file_descriptor { 
    int number; 
    struct inode *i; 
} 

在这种情况下,number是重复的,非唯一,和麻烦。

的C较新版本做这一个非问题通过将struct名到他们的命名空间,但这种习惯的某些部分一直延续:Linux内核,例如,填充:

struct iattr { 
    unsigned int ia_valid; 
    umode_t  ia_mode; 
    uid_t  ia_uid; 
.... 

struct inode { 
    /* RCU path lookup touches following: */ 
    umode_t   i_mode; 
    uid_t   i_uid; 
    gid_t   i_gid; 
    const struct inode_operations *i_op; 
    struct super_block *i_sb; 
... 

其中超前ia_i_来自struct iattrstruct inode - 这使得它稍微容易阅读这样的链条:

if (!IS_ERR(cookie) && path->dentry->d_inode->i_op->put_link) 
    path->dentry->d_inode->i_op->put_link(path->dentry, nd, cookie); 

(真的。 fs/namei.c,第821行和第822行在我的源代码中。)

它避免了当您打算使用该对象的成员(其中m是short)变量时意外使用局部变量。

private String name; 
private String mName; 
public void setName(String name) { 
    name = name; //wrong, just set the parameter variable to itself 
    this.name = name; //ok, but has 'this.' which isn't a problem, but some people don't like it 
    mName = name; //simples 
} 

m表示成员变量,s表示静态。这是一个常见的命名约定。但是和中微子一样,我并没有太多使用它。如果使用现代IDE,语法颜色编码会为您提供相同的信息(实际上更多,因为无论原始编码器是否遵循命名约定,它都可以工作)。